Linux進程間通訊的方式:
1. 管道(pipe)和有名管道(FIFO).
2. 信號(signal)
3. 消息隊列
4. 共享內存
5. 信號量
6. 套接字(socket)
管道通訊:
無名管道:由pipe()函數創建,int pipe(int filedis[2]), 當管道建立時有兩個文件描述符,filedis[0]用於讀管道,filedis[1]用於寫管道。關閉管道,僅需將兩個文件描述符關閉即可。
創建無名管道pipe():
#include <unistd.h>
#include <stdio.h>
int main(){
intpipe_filed[2];
if(pipe(pipe_filed)<0){
printf("pipecreate failed.\n");
return-1;
}
else{
printf("pipecreate successfully.\n");
close(pipe_filed[0]); //關閉相應讀管道(必須要)
close(pipe_filed[1]); //關閉相應寫管道(必須要)
}
}
注:fork()必須在pipe()之前來創建子進程,否則子進程無法進程相應的文件描述符,如果在fork之後,那麼fork會在子/父進程各執行一次,屬不同的管道。
讀寫無名管道示例:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main(){
charcache[100];
intfiledis[2];
if(pipe(filedis)< 0){
printf("Createpipe failed.\n");
return-1;
}
memset(cache,0, sizeof(cache)); //在一段內存塊中填充某個特定的值,此為,對cache數組以0進行填充
intpid;
pid= fork(); // 創建子進程
if(pid== 0){ // 進入子進程
printf("Inchild process.\n");
close(filedis[1]); // 關閉寫管道
sleep(3); // 等待,為了等父進程寫入東西
read(filedis[0],cache, 100); // 讀管道,並將內容寫入cache之中
printf("%s.\n",cache); // 打印cache內容
close(filedis[0]); // 關閉讀管道
}
elseif(pid > 0){ // 進入父進程
printf("Inparent process.\n");
close(filedis[0]); // 關閉讀管道
write(filedis[1],"Hello ",6); // 第一次寫入
write(filedis[1],"linuxdba", 8); // 第二次寫入
close(filedis[1]); // 關閉寫管道
wait(NULL); // 等待子進程退出再往下執行
}
else{
printf("Createchild process failed.\n");
return-1;
}
return0;
}