1. 程式人生 > 其它 >Linux下程序間通訊

Linux下程序間通訊

以下內容僅作為個人記錄的參考,但也歡迎讀者前來指正。

現在linux下使用較多的程序間通訊方式主要有以下幾種:
1.管道及有名管道(named pipe)。管道用於有親緣關係程序間通訊,有名管道沒有親緣關係限制。
2.訊號(signal):訊號是在軟體層面對終端機制的一種模擬
3.訊息佇列(messagae queue):克服前面的資訊量有限的缺點,具有許可權限制的功能
4.共享記憶體(shared memory):多個程序可以同時訪問同一塊記憶體空間,依靠某種同步機制,如互斥鎖和訊號量。
5.訊號量(semaphore):主要作為程序之間以及同一程序的不同執行緒之間的同步和互斥手段
6.套接字(socket)

1.管道:

建立管道時,它會建立兩個檔案描述符fds[0]/fds[1],分別固定為讀/寫。

#include<unistd.h>

int pipe(int fd[2]);

成功:返回0
失敗:返回-1
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<unistd.h>
 4 
 5 int main()
 6 {
 7         int pipefd[2];
 8         char buff[] = "hello";
 9         int len = strlen(buff);
10 char* data; 11 data = (char*)malloc(len+1); 12 if(pipe(pipefd)<0) 13 { 14 printf("create pipe error.\n"); 15 exit(1); 16 } 17 int pid; 18 pid = fork(); 19 if(pid==0) 20 { 21 close(pipefd[1
]); 22 sleep(3); 23 int readLen = read(pipefd[0],data,(len+1)); 24 if(readLen>0) 25 { 26 printf("child recv %d bytes,and data is %s\n",readLen,data); 27 exit(0); 28 } 29 30 } 31 else if(pid>0) 32 { 33 close(pipefd[0]); 34 sleep(1); 35 int writeLen = write(pipefd[1],buff,len); 36 printf("writeLen = %d\n",writeLen); 37 if(writeLen>0) 38 { 39 printf("parent write %d bytes,and data is %s.\n",writeLen,buff); 40 waitpid(pid,NULL,0); 41 exit(0); 42 } 43 } 44 return 0; 45 }

標準流管道:

使用popen(const char* command,const char* type);
類似於shell執行command一樣。
type可以是"r",該命令產生輸出
"w",該命令產生輸入

成功:返回檔案流指標
失敗:返回-1
pclose(fp);關閉上面產生的檔案流