linux unix程式設計手冊 51 55

2021-09-11 09:31:20 字數 4888 閱讀 5643

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系統的...