歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux 進程間通訊之創建無名管道和讀寫無名管道

Linux 進程間通訊之創建無名管道和讀寫無名管道

日期:2017/3/1 10:04:40   编辑:Linux編程

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;

}

Copyright © Linux教程網 All Rights Reserved