一、共享記憶體:
系統呼叫:shmget();當shmget()建立了一塊新的共享記憶體後,返回乙個可以用於引用該共享記憶體的shmid_ds資料結構的識別符號。
原型:int shmget(key_t key,int size,int shm***);
返回值:如果成功,返回共享記憶體段識別符號。
如果失敗,則返回-1
系統呼叫:shmat();將共享記憶體區域對映到自己程序中去。
原型:int shmat(int shmid,char *shmadddr,int shm***);
如果失敗,則返回-1。
系統呼叫:shmdt();當乙個程序不再需要共享的記憶體段時,它將會把記憶體段從其他位址空間中脫離。
原型:int shmdt(char *shmaddr);
返回值:如果失敗,則返回-1
例項**:shmadd.c
#include #include #include #include #include #define bufsz 2048
int main()
else printf("created shared-memory:%d\n",shmid);
system("ipcs -m");/*ipcs 命令往標準輸出寫入一些關於活動程序間通訊設施的資訊。*/
if((shmadd=shmat(shmid,0,0))<(char *)0)
else printf("attached shared-memory\n");
system("ipcs -m");
if((shmdt(shmadd))<0)
else printf("deleted shared-memory\n");
system("ipcs -m");
exit(0);
}
二、訊息佇列:
訊息佇列就是訊息的乙個鍊錶,它允許乙個或多個程序向它寫訊息,乙個或多個程序從中讀訊息。具有一定的fifo的特性,但是可實現訊息的隨即查詢。這些訊息存在核心中,由「佇列id」來標識。
訊息佇列的實現包括建立和開啟佇列、新增訊息、讀取訊息和控制訊息佇列這四種操作。
int msgget(key_t key,int flag):建立和開啟佇列,其訊息數量受系統限制。
int msgsnd(int msqid,struct msgbuf *msgp,size_t msgsz,int flag):新增訊息,將訊息新增到訊息佇列尾部。
int msgrcv(int msqid,struct msgbuf *msgp,size_t msgsz,long msgtyp,int flag):讀取訊息,從訊息佇列中取走訊息。
int msgctl(int msqid,int cmd,struct msqid_ds *buf):控制訊息佇列。
例項**msg.c
#include #include #include #include #include #include #include #define bufsz 512
struct message
; int main()
if((qid=msgget(key,ipc_creat|0666))==-1)
printf("opened queue %d\n",qid);
puts("please enter the message to queue:");
if((fgets((&sndmsg)->msg_text,bufsz,stdin))==null)
sndmsg.msg_type=getpid();
len=strlen(sndmsg.msg_text);
if((msgsnd(qid,&sndmsg,len,0))<0)
if((msgrcv(qid,&rcvmsg,bufsz,0,0)<0)
printf("message is :%s\n",(&rcvmsg)->msg_text);
if((msgctl(qid,ipc_rmid,null))<0)
exit(0);
}
三、管道
建立乙個簡單的管道,可以使用系統呼叫pipe()。他接受乙個引數,也就是乙個包括兩個整數的陣列。如果系統呼叫成功,此陣列將包括管道使用的兩個檔案描述符。建立乙個管道之後,一般情況下程序將產生乙個新的程序。
系統呼叫:pipe();
原型:int pipe(int fd[2]);
注意:fd[0]用於讀取管道,fd[1]用於寫入管道。
乙個管道是半雙工的。
管道例項**:
#include #include #include #include #include int main()
/*父程序寫,子程序讀*/
if((pid=fork())==0) /*在fork()建立的子程序當中*/
close(pipe_fd[0]);/*寫管道描述符關閉*/
exit(0); /*退出*/
}else if(pid>0)
}
linux程序通訊之管道
管道 可分為普通管道和命名管道。普通管道用於有親緣關係的程序間的通訊 父子程序 命名管道,通過給管道命名的方式,使得管道變成檔案系統中的管道檔案,從而允許無親緣關係的程序間通過訪問管道檔案進行通訊。管道是單向的,一端只能用於輸入,另一端只能用於輸出。管道是fifo的,即先進先出的,向管道中寫入的資料...
Linux 程序通訊之管道
管道是單向的 先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序 寫程序 在管道的尾部寫入資料,另乙個程序 讀程序 從管道的頭部讀出資料。資料被乙個程序讀出後,將被從管道中刪除,其他讀程序將不能再讀到這些資料。管道提供了簡單的流控制機制,程序試圖讀空管道時,程序將阻塞。同樣,管道已...
Linux 程序通訊之管道
管道是單向的 先進先出的,它把乙個程序的輸出和還有乙個程序的輸入連線在一起。乙個程序 寫程序 在管道的尾部寫入資料,還有乙個程序 讀程序 從管道的頭部讀出資料。資料被乙個程序讀出後,將被從管道中刪除,其它讀程序將不能再讀到這些資料。管道提供了簡單的流控制機制,程序試圖讀空管道時,程序將堵塞。相同,管...