Linux之程序通訊

2021-05-28 02:17:50 字數 2642 閱讀 4114

一、共享記憶體:

系統呼叫: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 程序通訊之管道

管道是單向的 先進先出的,它把乙個程序的輸出和還有乙個程序的輸入連線在一起。乙個程序 寫程序 在管道的尾部寫入資料,還有乙個程序 讀程序 從管道的頭部讀出資料。資料被乙個程序讀出後,將被從管道中刪除,其它讀程序將不能再讀到這些資料。管道提供了簡單的流控制機制,程序試圖讀空管道時,程序將堵塞。相同,管...