第 9 章 Linux進(jìn)程通信_(tái)第1頁(yè)
第 9 章 Linux進(jìn)程通信_(tái)第2頁(yè)
第 9 章 Linux進(jìn)程通信_(tái)第3頁(yè)
第 9 章 Linux進(jìn)程通信_(tái)第4頁(yè)
第 9 章 Linux進(jìn)程通信_(tái)第5頁(yè)
已閱讀5頁(yè),還剩56頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第9章Linux進(jìn)程通信內(nèi)容提要進(jìn)程通信概述管道內(nèi)存映射SystemVIPCPOSIXIPC文件鎖9.1進(jìn)程通信概述進(jìn)程通信概述進(jìn)程需彼此協(xié)同、交換和共享數(shù)據(jù),由于進(jìn)程的用戶空間各自獨(dú)立,無法直接溝通,但它們共享內(nèi)核空間和文件系統(tǒng),可借助內(nèi)核和文件來實(shí)現(xiàn)進(jìn)程間的通信。應(yīng)用編程接口分類API功能描述管道pipe建立無名管道Popen/pclose打開/關(guān)閉命令的標(biāo)準(zhǔn)輸入或輸出mkfifo創(chuàng)建命名管道內(nèi)存映像文件mmap/munmap建立/解除文件至內(nèi)存的映射SystemVIPC信號(hào)量semget創(chuàng)建/打開systemv信號(hào)量semop申請(qǐng)/釋放systemv信號(hào)量semctl操作systemv信號(hào)量消息隊(duì)列msgget創(chuàng)建/打開systemv消息隊(duì)列msgrcv從systemv消息隊(duì)列接收消息msgsnd向systemv消息隊(duì)列發(fā)送消息msgctl操作systemv消息隊(duì)列共享內(nèi)存shmget建立/打開systemv共享內(nèi)存shmat/shmdt建立/刪除systemv共享內(nèi)存映射shmctl操作systemv共享內(nèi)存POSIXIPC信號(hào)量sem_open/sem_close/sem_unlink打開/關(guān)閉/刪除POSIX信號(hào)量sem_wait/sem_post等待/釋放POSIX信號(hào)量Sem_init/sem_destroy初始化/注銷POSIX無名信號(hào)量消息隊(duì)列mq_open/mq_close/mq_unlink打開/關(guān)閉/刪除POSIX消息隊(duì)列mq_getattr/mq_setattr獲取/設(shè)置POSIX消息隊(duì)列屬性mq_receive/mq_send收發(fā)POSIX消息共享內(nèi)存shm_open/shm_unlink打開/刪除POSIX共享內(nèi)存文件鎖flock鎖定/解鎖文件9.2管道管道概述管道是一種進(jìn)程間的單向數(shù)據(jù)傳輸機(jī)制,基于先進(jìn)先出的字節(jié)流,管道有兩個(gè)端點(diǎn),一端用于寫入數(shù)據(jù),另一端用于從管道讀取,讀取的數(shù)據(jù)會(huì)從管道中移走。根據(jù)接口形式的不同,管道可分為無名管道和命名管道。管道的分類1.無名管道無名管道因無對(duì)應(yīng)的管道文件而得名,借助內(nèi)存而非外部文件實(shí)現(xiàn)通信,通常為關(guān)聯(lián)的進(jìn)程間建立通道。2.命名管道命名管道是建立于文件系統(tǒng)的特殊文件,借助文件接口實(shí)現(xiàn)進(jìn)程間通信。創(chuàng)建無名管道頭文件

#include<unistd.h>函數(shù)原型

int

pipe(intfd[2]);功能 創(chuàng)建無名管道。參數(shù)

pipefd[2]:對(duì)文件描述符。

flags:操作方式。返回值 成功返回0,否則返回-1。

無名管道的實(shí)現(xiàn)dentry(目錄項(xiàng))dentryf_opnamed_inodefile(文件描述)task_struct(進(jìn)程控制塊)fd0123465fd[](文件描述符表)file(文件描述)物理頁(yè)寫端讀端dentryf_opread_pipe_fops(文件操作集)write_pipe_fops(文件操作集)..read.write.管道創(chuàng)建命名管道頭文件

#include<sys/types.h> #include<sys/stat.h>函數(shù)原型

int

mkfifo(constchar*pathname,mode_tmode);功能 創(chuàng)建命名管道。參數(shù)

pathname:文件路徑名。

mode:存取權(quán)限。返回值 成功返回0,失敗返回-1。實(shí)例分析charbuffer[BUFSIZ];int

main(int

argc,char*argv[]){

intpipefd[2];

pipe(pipefd);

pid_t

pid=fork(); if(pid==0){ close(pipefd[1]); while(read(pipefd[0],&buffer,1)>0) write(1,&buffer,1); write(1,"\n",1); close(pipefd[0]); _exit(0); }else{ close(pipefd[0]); write(pipefd[1],argv[1],strlen(argv[1])); close(pipefd[1]);

wait(NULL); exit(0); }}9.3內(nèi)存映射內(nèi)存映射概述

內(nèi)存映射是一種將文件的某個(gè)區(qū)域

映射至進(jìn)程用戶地址空間的技術(shù)。內(nèi)存文件為一種特殊類型的文件,其內(nèi)容存儲(chǔ)于內(nèi)存頁(yè)中,例如,位于內(nèi)存文件系統(tǒng)中的文件屬于該類文件,利用內(nèi)存映射可將內(nèi)存文件的某個(gè)區(qū)域同時(shí)映射至多個(gè)進(jìn)程的用戶地址空間,從而實(shí)現(xiàn)進(jìn)程間的通信。POSIXIPC正是通過在內(nèi)存文件上建立內(nèi)存映射構(gòu)建。

mmap/munmap函數(shù)頭文件

#include<sys/mman.h>函數(shù)原型

void*mmap(void*addr,size_t

length,int

prot,int

flags,int

fd,off_toffset);

int

munmap(void*addr,size_tlength);功能 建立/解除內(nèi)存映射。參數(shù)

addr:映射區(qū)起始地址。

length:映射區(qū)大小。

prot:存取權(quán)限。

flags:映射方式。

fd:文件描述符。

offset:文件偏移量。返回值

mmap函數(shù)成功返回映射區(qū)起始地址,失敗返回MAP_FAILED。

munmap函數(shù)成功返回0,失敗返回-1。實(shí)例分析int

main(int

argc,char*argv[]){

int

fd=open("/dev/zero",O_RDWR,0); char*anon,*zero;anon=(char*)mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_ANON|MAP_SHARED,-1,0);zero=(char*)mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_FILE|MAP_SHARED,fd,0);

strcpy(anon,argv[1]);

strcpy(zero,argv[1]);

printf("anonymous:%s\tzero-backed:%s\n",anon,zero); switch((fork())){ case0:

strcpy(anon,argv[2]);

strcpy(zero,argv[2]);

munmap(anon,4096);

munmap(zero,4096);

close(fd); return0; } sleep(3);

printf("anonymous:%s\tzero-backed:%s\n",anon,zero);

munmap(anon,4096);

munmap(zero,4096);

close(fd); return0;}9.4SystemVIPC內(nèi)容提要SystemVIPC概述

SystemV信號(hào)量

SystemV消息隊(duì)列

SystemV共享內(nèi)存SystemVIPC概述SystemVIPC源自SystemV系統(tǒng),是一種傳統(tǒng)的進(jìn)程間通信的接口規(guī)范,在各類傳統(tǒng)Unix系統(tǒng)中得到廣泛使用,它由信號(hào)量、消息隊(duì)列和共享內(nèi)存三部分構(gòu)成,可實(shí)現(xiàn)進(jìn)程間的同步、數(shù)據(jù)傳輸和數(shù)據(jù)共享,

自Linux誕生之初,Linux內(nèi)核就提供了對(duì)SystemVIPC的支持。

SystemVIPC通過在內(nèi)核中創(chuàng)建IPC對(duì)象實(shí)現(xiàn),每個(gè)IPC對(duì)象對(duì)應(yīng)一個(gè)唯一的ID。SystemV信號(hào)量

信號(hào)量表示某種資源的數(shù)量,資源的數(shù)量可反映到信號(hào)量的數(shù)值上,當(dāng)信號(hào)量大于0時(shí),表示有資源可供使用,當(dāng)信號(hào)量等于0時(shí),表示已無資源可用,申請(qǐng)資源者需要等待。

SYSTEMV信號(hào)量用信號(hào)量集表示,由若干信號(hào)量組成,可同時(shí)反映多種資源的狀態(tài),一次可支持對(duì)一個(gè)或多個(gè)信號(hào)量的原子操作。SystemV信號(hào)量的操作步驟(1)創(chuàng)建/打開一個(gè)SystemV信號(hào)量集。(2)初始化SystemV信號(hào)量(3)申請(qǐng)/釋放SystemV信號(hào)量(4)當(dāng)SystemV信號(hào)量不再使時(shí),將其刪除。semget函數(shù)頭文件

#include<sys/types.h> #include<sys/ipc.h> #include<sys/sem.h>函數(shù)原型

int

semget(key_tkey,int

nsems,int

semflg);功能 獲得或創(chuàng)建信號(hào)量。參數(shù)

key:IPC對(duì)象標(biāo)識(shí)。

nsems:信號(hào)量的數(shù)量。

semflg:存取權(quán)限和操作方式。返回值 成功返回信號(hào)量的標(biāo)識(shí),失敗返回-1。信號(hào)量相關(guān)狀態(tài)信息內(nèi)核用數(shù)據(jù)結(jié)構(gòu)記錄每一種信號(hào)量的狀態(tài)信息,例如:unsignedshortsemval;//信號(hào)量當(dāng)前值unsignedshortsemzcnt;//等待信號(hào)量變?yōu)?的進(jìn)程/線程的數(shù)量unsignedshortsemncnt;//等待釋放信號(hào)量的進(jìn)程/線程數(shù)量pid_t

sempid//最近一次修改信號(hào)量的進(jìn)程ID

信號(hào)量的申請(qǐng)與釋放會(huì)修改semval,當(dāng)無信號(hào)量可用時(shí),調(diào)用者進(jìn)程便會(huì)進(jìn)入semncnt和semzcnt關(guān)聯(lián)的等待隊(duì)列。semop函數(shù)頭文件

#include<sys/types.h> #include<sys/ipc.h> #include<sys/sem.h>函數(shù)原型

int

semop(int

semid,struct

sembuf*sops,unsignednsops);功能 獲得/釋放信號(hào)量。參數(shù)

semid:信號(hào)量標(biāo)識(shí)。

sops::信號(hào)量數(shù)組。

nsops:信號(hào)量數(shù)量。返回值 成功返回0,失敗返回-1。semop函數(shù)(續(xù))struct

sembuf{ushort

sem_num; //在信號(hào)量數(shù)組中的索引shortsem_op; //操作類型shortsem_flg; //操作標(biāo)志};sembuf結(jié)構(gòu)中成員變量sem_op描述信號(hào)量的操作類型參數(shù)sem_op含義sem_op>0指定信號(hào)量與sem_op相加,釋放更多的信號(hào)量,喚醒正在等待該信號(hào)量的進(jìn)程/線程sem_op=0等待指定信號(hào)量變?yōu)?sem_op<0指定信號(hào)量與sem_op相加,若值大于等于0,表示獲得信號(hào)量,否則等待semctl函數(shù)頭文件

#include<sys/types.h> #include<sys/ipc.h> #include<sys/sem.h>函數(shù)原型

int

semctl(int

semid,int

semnum,int

cmd,...);功能 信號(hào)量的控制操作。參數(shù)

semid:信號(hào)量標(biāo)識(shí)。

semnum:在信號(hào)量集中的索引。

cmd:操作類型。返回值 成功返回值由具體操作決定,失敗返回-1。semctl函數(shù)(續(xù))unionsemun{

int

val;//用于設(shè)置信號(hào)量的值

struct

semid_ds*buf;//緩存地址,用于IPC_STAT和IPC_SETunsignedshort*array;//數(shù)組地址,用于GETALL和SETALL

struct

seminfo*__buf;//緩存地址,用于IPC_INFO};參數(shù)cmd含義GETVAL獲得信號(hào)量的值SETVAL設(shè)置信號(hào)量的值GETPID獲得最后一次操作信號(hào)量的進(jìn)程GETNCNT獲得正在等待信號(hào)量的進(jìn)程數(shù)GETZCNT獲得等待信號(hào)量值變?yōu)?的進(jìn)程數(shù)IPC_RMID刪除信號(hào)量集,喚醒所有等待的進(jìn)程/線程3SystemV消息隊(duì)列

消息隊(duì)列是存在于內(nèi)核中的消息列表,一個(gè)進(jìn)程可將消息發(fā)送至消息隊(duì)列,另一個(gè)進(jìn)程則可從消息隊(duì)列中獲取消息。棧堆數(shù)據(jù)代碼棧堆數(shù)據(jù)代碼進(jìn)程1進(jìn)程2消息隊(duì)列Linux內(nèi)核Linux內(nèi)核SystemV消息隊(duì)列的操作步驟(1)建/打開SystemV消息隊(duì)列。(2)接收/發(fā)送SystemV消息。(3)當(dāng)SystemV消息隊(duì)列不再使用時(shí),將其刪除。msgget函數(shù)頭文件

#include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h>函數(shù)原型

int

msgget(key_tkey,int

msgflg);功能 創(chuàng)建/打開SystemV消息隊(duì)列參數(shù)

key:IPC對(duì)象標(biāo)識(shí)。

msgflg:存取權(quán)限和操作方式。返回值 成功返回消息隊(duì)列標(biāo)識(shí),失敗返回-1。msgrcv/msgsnd函數(shù)頭文件

#include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h>函數(shù)原型

ssize_t

msgrcv(int

msqid,void*msgp,size_t

msgsz,long

msgtyp,int

msgflg);

int

msgsnd(int

msqid,constvoid*msgp,size_t

msgsz,int

msgflg);功能接收/發(fā)送SystemV消息。參數(shù)

msqid:消息隊(duì)列的標(biāo)識(shí)。

msgp:消息地址。

msgsz:消息大小(字節(jié)數(shù))。

msgtyp:接收消息類型。

msgflg:操作方式。返回值 成功返回0,失敗返回-1。struct

msgbuf{longmtype;//消息類型,必須大于0charmtext[1];//消息,具體結(jié)構(gòu)用戶可自定義};msgctl函數(shù)頭文件

#include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h>函數(shù)原型

int

msgctl(int

msqid,int

cmd,struct

msqid_ds*buf);功能控制SystemV消息隊(duì)列的屬性。參數(shù)

msqid:消息隊(duì)列標(biāo)識(shí)。

cmd:操作類型。

buf:指向操作的數(shù)據(jù)。返回值 成功返回0,失敗返回-1。msgctl函數(shù)struct

msqid_ds{

struct

ipc_perm

msg_perm;

struct

msg*msg_first; //指向消息隊(duì)列的首

struct

msg*msg_last; //指向消息隊(duì)列的尾

__kernel_time_t

msg_stime; //最后發(fā)送時(shí)間

__kernel_time_t

msg_rtime; //最后接收時(shí)間

__kernel_time_t

msg_ctime; //最后修改時(shí)間

unsignedshortmsg_cbytes; //當(dāng)前消息隊(duì)列的字節(jié)數(shù)

unsignedshortmsg_qnum; //消息隊(duì)列中的消息數(shù)

unsignedshortmsg_qbytes; //消息隊(duì)列的最大字節(jié)數(shù)

__kernel_ipc_pid_t

msg_lspid; //最后發(fā)送消息的進(jìn)程ID__kernel_ipc_pid_t

msg_lrpid; //最后接收消息的進(jìn)程ID};參數(shù)cmd含義IPC_RMID刪除消息隊(duì)列IPC_STAT獲取消息隊(duì)列的狀態(tài)IPC_SET改變消息隊(duì)列的存取權(quán)限struct

ipc_perm{

key_tkey; //IPC對(duì)象標(biāo)識(shí)

uid_t

uid; //用戶ID

gid_t

gid; //用戶組ID

uid_t

cuid; //創(chuàng)建用戶ID

gid_t

cgid; //創(chuàng)建用戶組IDunsignedshortmode; //權(quán)限分配

unsignedshortseq; //序列號(hào)};SystemV共享內(nèi)存

將同時(shí)映射至不同進(jìn)程用戶空幻的物理內(nèi)存稱為共享內(nèi)存,物理內(nèi)存可由若干不連續(xù)的物理頁(yè)構(gòu)成,共享內(nèi)存在不同進(jìn)程用戶空間的地址未必相同。內(nèi)核棧堆數(shù)據(jù)代碼內(nèi)核棧堆數(shù)據(jù)代碼進(jìn)程1進(jìn)程2物理內(nèi)存映射映射1.SYSTEMV共享內(nèi)存的操作步驟(1)創(chuàng)建/打開SystemV共享內(nèi)存。(2)將SystemV共享內(nèi)存映射至調(diào)用者進(jìn)程的用戶空間。(3)當(dāng)SystemV共享內(nèi)存不再使用時(shí),將映射接觸。shmget函數(shù)頭文件

#include<sys/ipc.h> #include<sys/shm.h>函數(shù)原型

int

shmget(key_tkey,intsize,int

shmflg);功能 創(chuàng)建/獲得systemv共享內(nèi)存。參數(shù)

Key:共享內(nèi)存標(biāo)識(shí)。

size:共享內(nèi)存大小。

shmflg存取權(quán)限和操作方式。返回值 成功返回消息隊(duì)列標(biāo)識(shí),失敗返回-1。shmat/shmdt函數(shù)

頭文件

#include<sys/types.h> #include<sys/shm.h>函數(shù)原型

void*shmat(int

shmid,constvoid*shmaddr,int

shmflg);

int

shmdt(constvoid*shmaddr);功能 建立/解除SystemV共享內(nèi)存的內(nèi)存映射。參數(shù)

shmid:IPC對(duì)象標(biāo)識(shí)。

shmaddr:映射地址。

shmflg:權(quán)限和操作方式。返回值 成功返回映射的地址,失敗返回-1。shmctl函數(shù)頭文件

#include<sys/types.h> #include<sys/shm.h>函數(shù)原型

int

shmctl(int

shmid,int

cmd,struct

shmid_ds*buf);功能 操作systemv共享內(nèi)存。參數(shù)

shmid:IPC對(duì)象標(biāo)識(shí)。

cmd:操作命令。

buf:共享內(nèi)存屬性地址。返回值 成功返回0,失敗返回-1。shmctl函數(shù)struct

shmid_ds{

struct

ipc_perm

shm_perm; //存取權(quán)限

int

shm_segsz; //共享內(nèi)存大小

__kernel_time_t

shm_atime; //最后映射時(shí)間

__kernel_time_t

shm_dtime; //最后解除映射時(shí)間

__kernel_time_t

shm_ctime; //最后修改時(shí)間

__kernel_ipc_pid_t

shm_cpid; //創(chuàng)建進(jìn)程ID__kernel_ipc_pid_t

shm_lpid; //最近操作進(jìn)程IDunsignedshort shm_nattch; //建立映射的進(jìn)程數(shù)};參數(shù)cmd描述IPC_STAT獲取共享內(nèi)存的狀態(tài)IPC_SET設(shè)置共享內(nèi)存的權(quán)限IPC_RMID刪除共享內(nèi)存IPC_LOCK鎖定共享內(nèi)存,使共享內(nèi)存不被交換出去IPC_UNLOCK解鎖共享內(nèi)存9.5POSIXIPC內(nèi)容提要POSIXIPC概述POSIX信號(hào)量

POSIX消息隊(duì)列POSIX共享內(nèi)存POSIXIPC概述

為了消除各類Unix間的差異,POSIX設(shè)計(jì)了一套具有更高可移植性的IPC接口標(biāo)準(zhǔn),相較于SystemVIPC,POSIXIPC語(yǔ)法較為簡(jiǎn)潔,它同樣支持信號(hào)量、消息隊(duì)列和共享內(nèi)存。在較新的Linux內(nèi)核中實(shí)現(xiàn)了對(duì)POSIXIPC的支持。POSIX信號(hào)量POSIX信號(hào)量是一種進(jìn)程間同步的控制機(jī)制,信號(hào)量用整數(shù)表示,通常代表某種資源的數(shù)量。進(jìn)程通過減操作申請(qǐng)獲得信號(hào)量,通過加操作申請(qǐng)釋放信號(hào)量,當(dāng)信號(hào)量值為0時(shí),試圖獲取信號(hào)量的進(jìn)程掛起,直至其他進(jìn)程釋放信號(hào)量;反之,當(dāng)信號(hào)量已達(dá)上限,試圖釋放信號(hào)量的進(jìn)程掛起,直至其他進(jìn)程獲取了信號(hào)量。POSIX信號(hào)量的分類POSI命名信號(hào)量在Linux系統(tǒng)中,命名信號(hào)量存儲(chǔ)于文件系統(tǒng)tmpfs,tmpfs通常掛載至/dev/shm,當(dāng)創(chuàng)建一個(gè)新POSIX命名信號(hào)量時(shí),同名文件會(huì)出現(xiàn)在/dev/shm目錄。2.POSIX無名信號(hào)量POSIX無名信號(hào)量在文件系統(tǒng)上無對(duì)應(yīng)的文件,如同無名管道一樣,可用于父子進(jìn)程及其線程間的同步控制。POSIX信號(hào)量的操作步驟1.創(chuàng)建/打開POSIX信號(hào)量。1.申請(qǐng)/釋放POSIX信號(hào)量。3.當(dāng)完成對(duì)信號(hào)量的操作,及時(shí)關(guān)閉信號(hào)量。4.當(dāng)所有進(jìn)程都關(guān)閉了信號(hào)量,將信號(hào)量刪除。創(chuàng)建/打開/關(guān)閉/刪除POSIX命名信號(hào)量。(1)sem_open/sem_close/sem_unlink函數(shù)頭文件

#include<fcntl.h> #include<sys/stat.h> #include<semaphore.h>函數(shù)原型

sem_t*sem_open(constchar*name,int

oflag);

sem_t*sem_open(constchar*name,int

oflag,mode_tmode,unsignedintvalue);

int

sem_close(sem_t*sem);

int

sem_unlink(constchar*name);功能 創(chuàng)建/打開/關(guān)閉/刪除POSIX命名信號(hào)量。參數(shù)

name:信號(hào)量名稱。

oflag:操作方式。

mode:權(quán)限設(shè)置。

value:信號(hào)量初始值。返回值

sem_open函數(shù)成功返回信號(hào)量地址,失敗返回SEM_FAILED。申請(qǐng)/釋放POSIX信號(hào)量(2)sem_wait/sem_post函數(shù)頭文件

#include<semaphore.h>函數(shù)原型

int

sem_wait(sem_t*sem);

int

sem_timedwait(sem_t*sem,conststruct

timespec*abs_timeout);

int

sem_post(sem_t*sem);功能 申請(qǐng)獲取/釋放POSIX信號(hào)量。參數(shù)

sem:信號(hào)量對(duì)象。

abs_timeout:超時(shí)時(shí)間。返回值 成功,返回0,失敗,返回-1。初始化/注銷POSIX無名信號(hào)量(3)sem_init/sem_destroy函數(shù)頭文件

#include<semaphore.h>函數(shù)原型

int

sem_init(sem_t*sem,int

pshared,unsignedintvalue)

int

sem_destroy(sem_t*sem)功能 初始化/注銷POSIX無名信號(hào)量。參數(shù)

sem:信號(hào)量。

pshared:共享標(biāo)志。

value:信號(hào)量的初始值。返回值 成功,返回0,否則,返回-1。POSIX無名信號(hào)量在文件系統(tǒng)上無對(duì)應(yīng)的文件,如同無名管道一樣,基于內(nèi)存實(shí)現(xiàn),可用于父子進(jìn)程及其線程間的同步控制。POSIX消息隊(duì)列POSIX消息隊(duì)列是一種進(jìn)程間以消息為單位的數(shù)據(jù)傳輸機(jī)制,消息以隊(duì)列形式儲(chǔ)存,并為消息定義優(yōu)先級(jí),優(yōu)先級(jí)高的消息會(huì)被優(yōu)先處理。POSIX消息隊(duì)列的實(shí)現(xiàn)在Linux系統(tǒng)中,POSIX消息隊(duì)列存儲(chǔ)于mqueue文件系統(tǒng),若將mqueue文件系統(tǒng)掛載至/dev/mqueue目錄,新建的消息隊(duì)列會(huì)在/dev/mqueue生成相應(yīng)的文件.POSIX消息隊(duì)列的操作步驟1.創(chuàng)建/打開一個(gè)POSIX消息隊(duì)列。2.接收/發(fā)送消息。3.當(dāng)完成對(duì)消息隊(duì)列的操作,應(yīng)及時(shí)關(guān)閉消息隊(duì)列。4.當(dāng)所有進(jìn)程不再使用消息隊(duì)列時(shí),應(yīng)將消息隊(duì)列刪除。創(chuàng)建/打開/關(guān)閉/刪除POSIX消息隊(duì)列(1)mq_open/mq_close/mq_unlink函數(shù)頭文件

#include<fcntl.h> #include<sys/stat.h> #include<mqueue.h>函數(shù)原型

mqd_t

mq_open(constchar*name,int

oflag);

mqd_t

mq_open(constchar*name,int

oflag,mode_t

mode,struct

mq_attr*attr);

int

mq_close(mqd_t

mqdes);

int

mq_unlink(constchar*name);功能 創(chuàng)建/打開/關(guān)閉/刪除POSIX消息隊(duì)列。參數(shù)

name:POSIX消息隊(duì)列名稱。

oflag:操作方式。

mode:訪問權(quán)限。

attr:屬性地址。返回值

mq_open函數(shù)成功返回消息隊(duì)列描述符,失敗返回-1。struct

mq_attr{longmq_flags;//收發(fā)信息是否阻塞,取值為0或O_NONBLOCKlongmq_maxmsg;//發(fā)送消息數(shù)量上限

longmq_msgsize;//每條消息的最大上限

longmq_curmsgs;//當(dāng)前消息的數(shù)量};獲取/設(shè)置POSIX消息隊(duì)列屬性(2)mq_getattr/mq_setattr函數(shù)頭文件

#include<mqueue.h>函數(shù)原型

int

mq_getattr(mqd_t

mqdes,struct

mq_attr*attr);

int

mq_setattr(mqd_t

mqdes,conststruct

mq_attr*newattr,struct

mq_attr*oldattr);功能 獲取/設(shè)置POSIX消息隊(duì)列屬性。參數(shù)

mqdes:消息隊(duì)列描述符。

attr:屬性地址。

newattr:新屬性地址。

oldattr:原屬性地址。返回值 成功返回0,失敗返回-1。接收/發(fā)送消息(3)mq_receive/mq_send函數(shù)頭文件

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論