system v ipc 和 posix ipc比較
和system v 訊息佇列對比 開啟,關閉和斷開訊息佇列#include
#include
#include
mqd_t mq_open(const
char *name, int oflag, .../* mode_t mode, struct mq_attr */);
// oflag 中指定o_creat 後需要傳mode(許可權掩碼)
intmq_close
(mqd_t mqdes)
;// 0 s, -1 e
// 如果通過mqdes註冊了訊息通知,通知註冊會被刪除
intmq_unlink
(const
char *name)
;// 0 s, -1 e
複製**
fork繼承exec登出描述符和訊息佇列的關係(類似檔案描述符和檔案)
訊息佇列特性
struct
mq_attr ;
複製**
#include
intmq_getattr
(mqd_t mqdes, struct mq_attr *attr)
;// 0 s, -1 e
intmq_setattr
(mqd_t mqdes, const struct mq_attr *newattr, struct mq_attr *oldattr)
;// 0 s, -1 e
//susv3 規定mq_setattr()只能修改mq_flags, 為啥是susv3規定的???
複製**
交換訊息#include
intmq_send
(mqd_t mqdes, const
char *msg_ptr, size_t msg_len, unsigned
int msg_prio)
;// 0 s, -1 e
// msg_prio 優先順序,0最小
size_t mq_receive(mqd_t mqdes, const
char *msg_ptr, size_t msg_len, unsigned
int msg_prio);
// num of bytes received, -1 error
// 需要msg_len >= mq_msgsize否則報錯emsgsize
#define _xopen_source 600
#include
// 和以上一致,只是多了沒有設定o_nonblock標記時的超時時間
intmq_timedsend
(mqd_t mqdes, const
char *msg_ptr, size_t msg_len, unsigned
int msg_prio, const struct timespec *abs_timeout)
;int
mq_timedreceive
(mqd_t mqdes, const
char *msg_ptr, size_t msg_len, unsigned
int msg_prio, const struct timespec *abs_timeout)
;複製**
訊息通知#include
union si**al ;
struct
sigevent ;
intmq_notify
(mqd_t mqdes, const struct sigevent *notification)
;// 0 s, -1 e
複製**
sigev_notify取值linux特有特性
命名訊號量
#include
#include
#include
sem_t *sem_open(const
char *name, int oflag, .../* mode_t mode, unsigned int value*/)
// value是初始值
// 其他均類似
intsem_close
(sem_t *sem)
;int
sem_unlink
(const
char *name)
;複製**
訊號量的操作#include
intsem_wait
(sem_t *sem)
;// 訊號量減1,如果不大於0會阻塞
intsem_trywait
(sem_t *sem)
;// 不會阻塞
#define _xopen_source 600
intsem_timedwait
(sem_t *sem, const struct timespec *abs_timeout)
;int
sem_posy
(sem_t *sem)
;// 訊號量加1
intsem_getvalue
(sem_t *sem, int *sval)
;//獲取當前值
複製**
未命名訊號量
會多兩個介面
#include
intsem_init
(sem_t *sem, int pshared, unsigned
int value)
;int
sem_destroy
(sem_t *sem)
;複製**
pshared表明訊號是執行緒共享還是程序共享
posix共享記憶體物件的操作流程####共享記憶體物件的操作
#include
#include
#include
intshm_open
(const
char *name, int oflag, mode_t mode)
;int
shm_unlink
(const
char *name)
;複製**
flock()對整個檔案加鎖 fcntl()對乙個檔案區域加鎖,包含了flock的功能
由於stdio庫會在使用者空間緩衝,需要注意利用flock給檔案加鎖
#include
intflock
(int fd, int operation)
;// 0 s, -1 e
複製**
opeartion 可選引數,未設定非阻塞會一直等到解鎖
再次呼叫可以進行鎖的轉換,但是轉換不一定是原子的
鎖的繼承和釋放
限制利用fcntl給記錄加鎖
#include
#include
int fcntl(int fd, int cmd, ... /* arg */ );
//加鎖時一般呼叫
struct flock ;
fcntl(fd, cmd, &flockstr);
複製**
cmd 在設定鎖時為
其他
鎖的繼承和釋放強制加鎖/proc/locks檔案
$
cat /proc/locks
序號 鎖型別 鎖模式 讀寫鎖 pid 檔案系統主次裝置號+inode 起始位元組 截止位元組
1: posix advisory write 458 03:07:133880 0 eof
2: flock advisory write 404 03:07:133875 0 eof
3: posix advisory write 312 03:07:133853 0 eof
4: flock advisory write 274 03:07:81908 0 eof
複製**
找到乙個程序給什麼檔案上了鎖
其他
讀書筆記之linux unix系統程式設計手冊 43
程序間通訊介紹 1.unix系統上各種通訊和同步工具,並根據功能將他們分成了三類 1 通訊 這些工具關注程序之間的資料交換 2 同步 這些程序關注程序和執行緒操作之間的同步 3 訊號 儘管訊號的主要作用並不在此,但在特定場景下可以將它作為一種同步技術 2.資料傳輸工具 為了通訊,乙個程序將資料寫入i...
《Linux UNIX系統程式設計手冊》第1章讀書筆記
寫在前面的話 一切偉大的行動和思想都有乙個眇乎小哉的開始。第1章 歷史和標準 看第1章題目就可以知道本章要講的是歷史和標準。我們會問,歷史是講誰的歷史?1.unix和c語言的歷史 這段歷史已經聽過很多了,要注意它是at t公司整出來的,其中c語言完全是為了實現unix核心及相關軟體而開發的。注意其中...
《Linux UNIX系統程式設計手冊》第2章讀書筆記
寫在前面的話 紅燭啊!你流一滴淚,灰一分心。灰心流淚你的果,創造光明你的因。紅燭啊!莫問收穫,但問耕耘。第2章 基本概念 本章講了很多基本概念,有的概念會貫穿全書,有的概念作者只簡單提了一下,後面的章節會有深入講解。對於這些概念,博主不一一介紹,而是將其中有聯絡的概念放到一起說。一 linux系統的...