pipe()函数详解
管道概述
管道也叫無名管道,它是UNIX系統IPC(進程間通信)的最古老形式,所有的UNIX系統都支持這種機制。
無名管道特點
1.半雙工,數據在同一時刻只能在一個方向上流動
2.數據只能從管道的一端寫入,從另一端讀出
3.寫入管道的數據遵循先入先從出的規則
4.管道所傳送的數據不是無格式的,這要求管道的讀出方和寫入方必須約定好數據的格式,如多少字節算一個消息
5.管道不是普通的文件,不屬于某個文件系統,其只存在于內存中
6.管道在內存中對應一個緩沖區,不同的系統其大小不一定相同
7.從管道讀數據是一次性操作,數據一旦被讀走,它就從管道中丟棄,釋放空間以便寫更多的數據
8.管道沒有名字,只能在具有公共祖先的進程(父進程和子進程,或兩個兄弟進程)之間使用
pipe函數
pipe()函數可用于創建一個管道,以實現進程間的通信。
pipe()函數的定義如下:
pipe函數定義中的fd參數是一個大小為2的數組類型指針。
通過pipe函數創建的這兩個文件描述符fd[0]和fd[1]分別構成管道的兩端,往fd[1]寫入的數據可以從fd[0]讀出,并且fd[1]一端只能進行寫操作,fd[0]一端只能進行讀操作,不能反過來使用。要實現雙向數據傳輸,可以使用兩個管道。
默認情況下,這一對文件描述符都是阻塞的。此時,如果我們用read系統調用來讀取一個空的管道,則read將被阻塞,知道管道內有數據可讀;如果我們用write系統調用往一個滿的管道中寫數據,則write也將被阻塞,直到管道內有足夠的空閑空間可用(read讀取數據后管道中將清楚讀走的數據)。當然,用戶可以將fd[0]和fd[1]設置為非阻塞的。
單個進程中的管道幾乎沒有任何用處。對于一個從父進程到子進程的管道,父進程關閉管道的讀端fd[0],子進程關閉管道的寫端fd[1],如下圖所示:
當管道的一端關閉后,下列兩條規則起作用
實例
創建一個從父進程到子進程的管道,并且父進程經由該管道向子進程傳送數據
#include <unistd.h>int main(void) {int n;int fd[2];pid_t pid;char line[MAXLINE];if (pipe(fd) < 0) {err_sys("pipe error");}if ((pid = fork()) < 0) {err_sys("fork error");} else if (pid > 0) {/* parent */close(fd[0]);write(fd[1], "hello world\n", 12);} else {close(fd[1]);n = read(fd[0], line, MAXLINE);write(STDOUT_FILENO, line, n);}exit(0); }總結
以上是生活随笔為你收集整理的pipe()函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Metro风格用户界面设计原则
- 下一篇: 用photoshop做电影胶片效果