linux程序通訊 管道

2021-06-28 13:01:55 字數 2651 閱讀 3156

管道分為有名管道和無名管道。

無名管道:

無名管道是半雙工的,就是對於乙個管道來講只能讀或者寫。就像高速公路一樣一條路只能單向行駛。

建立無名管道的函式:

所需要標頭檔案:#include

函式原型:int pipe(int fd[2])

函式的返回值:失敗返回-1,成功返回0

乙個簡單的無名管道的例子:

/*

* main.c

* * created on: 2015-1-29

* author: hsc

*/#include #include #include#include#include #include #include int main(void)

pid = fork();//建立程序

if(pid == -1)

if(pid == 0)

close(pipefd[0]);

} else

close(pipefd[1]);

waitpid(pid,null,0);//等待子程序退出

} return 0;

}

有名管道(fifo):

有名管道是持久穩定的,存在於檔案系統。

fifo除了具有無名管道的所有特性外,它還允許無親緣關係的程序間通訊進行資料交換。

可以通過shell 命令建立有名管道

mkfifo  [option] name

mkfifo 建立乙個名為name的有名管道

例如:mkfifo   fifo

使用cat  重新開啟乙個終端,到同一目錄下執行ls -l>fifo。這裡》符號是重定向輸出表示向道fifo寫內容。

在建立管道成功之後,就可以使用open(),read(),write()這些系統呼叫,就像操作普通檔案一樣,對於為讀而開啟的管道,在open()設定為o_rdonly,同樣為寫而開啟的管道在open()設定為o_wronly,與讀寫普通檔案不同是阻塞問題。當然可以在open()函式設定非阻塞標誌o_nonblock。這裡對於乙個管道可以理解為從管道的一頭寫另一頭讀。

對於讀程序:

1.如果管道是阻塞開啟,且當管道內沒有資料,則對於讀程序來說將一直阻塞到有資料寫入。

2.如果管道是非阻塞開啟,則不論管道內是否有資料,讀程序都會立即執行讀的操作。沒有資料,則返回0。

對於寫程序:

1.如果管道是阻塞開啟,且當管道內沒有資料,則對於寫程序來說將一直阻塞到有資料可以被寫入(比如管道滿了)。

2.如果管道是非阻塞開啟而不能寫入全部資料,則讀操作進行的部分寫入或者呼叫失敗。

值得注意的是:在資料能被傳送之前,管道必須被開啟在兩端(讀和寫),正常情況下只open乙個它會阻塞直到另外乙個open。也就是說你先執行寫的管道(fifo)則程式會

阻塞在open()函式這裡,直到執行讀管道程式open()。

讀程式如下:read_fifo.c 

/*

* read_fifo.c

* * created on: 2015-2-2

* author: hsc

*//*

* main.c

* * created on: 2015-2-2

* author: hsc

*/#include#include#include#include #include#include #include#define myfifo "myfifo"

#define buffsize 1024

int main()

} fd = open(myfifo,o_rdonly);// 已唯讀方式開啟管道檔案

if(fd == -1)

memset(buf,0,buffsize);//buf 清空

if(read(fd,buf,buffsize) ==-1)// 讀管道

else

close(fd);//關閉開啟管道

return 0;

}

寫管道程式:write_fifo.c

/*

* main.c

* * created on: 2015-2-2

* author: hsc

*/#include#include#include#include #include#include #include#define myfifo "myfifo"

#define buffsize 1024

int main()

} fd = open(myfifo,o_wronly);// 已只寫方式開啟管道檔案

if(fd == -1)

memset(buf,0,buffsize);

strcpy(buf,"hello fifo \n");

if(write(fd,buf,strlen(buf))>0)//寫管道

else

close(fd);

return 0;

}

linux 程序通訊 管道通訊

程序通訊 1 pipe 函式的作用 建立無名管道 函式的原型 int pipe int fds 2 函式的引數 新建的兩個描述符fds陣列返回 fds 0 表示管道的讀取端 fds 1 表示管道的寫入端 返回值 成功 0 出錯 1 標頭檔案 include 2 mkfifo 函式的作用 建立有名管道...

程序通訊 管道通訊

程序間通訊 目的 資料傳輸 乙個程序需要將它的資料傳送給另乙個程序 資源共享 多個程序之間共享同樣的資源 通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知它們發生了某種事件 程序控制 有些程序希望完全控制另乙個程序的執行 如debug程序 此時控制程序希望能夠攔截另乙個程序的所有操作,並能夠及...

程序通訊 管道通訊

自己的理解,首先要區分概念 管道和管道通訊 所謂 管道 是指用於連線乙個讀程序和乙個寫程序以實現它們之間通訊的乙個共享檔案,又名pipe檔案 是一種特殊的檔案,這就意味著你可以向操作檔案一樣操作無名管道,無名管道在核心中對應的是一段特殊的記憶體空間,這段記憶體空間由作業系統進行管理,對使用者是不可見...