日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pipe()函数详解

發布時間:2023/12/18 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pipe()函数详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

管道概述

管道也叫無名管道,它是UNIX系統IPC(進程間通信)的最古老形式,所有的UNIX系統都支持這種機制。

無名管道特點

1.半雙工,數據在同一時刻只能在一個方向上流動
2.數據只能從管道的一端寫入,從另一端讀出
3.寫入管道的數據遵循先入先從出的規則
4.管道所傳送的數據不是無格式的,這要求管道的讀出方和寫入方必須約定好數據的格式,如多少字節算一個消息
5.管道不是普通的文件,不屬于某個文件系統,其只存在于內存中
6.管道在內存中對應一個緩沖區,不同的系統其大小不一定相同
7.從管道讀數據是一次性操作,數據一旦被讀走,它就從管道中丟棄,釋放空間以便寫更多的數據
8.管道沒有名字,只能在具有公共祖先的進程(父進程和子進程,或兩個兄弟進程)之間使用

pipe函數

pipe()函數可用于創建一個管道,以實現進程間的通信。
pipe()函數的定義如下:

#include<unistd.h>/* @param fd,經參數fd返回的兩個文件描述符* fd[0]為讀而打開,fd[1]為寫而打開* fd[1]的輸出是fd[0]的輸入* @return 若成功,返回0;若出錯,返回-1并設置errno*/ int pipe(int fd[2]);

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],如下圖所示:

當管道的一端關閉后,下列兩條規則起作用

  • 當讀(read)一個寫端已被關閉的管道時,在所有數據都被讀取后,read返回0,表示文件結束。(從技術上來講,如果管道的寫端還有進程,就不會產生文件的結束。可以復制一個管道的描述符,使得有多個進程對它具有寫打開文件描述符)
  • 如果寫(write)一個讀端已被關閉的管道時,則產生信號SIGPIPE。如果忽略該信號或者捕捉該信號并從其處理程序返回,則write返回-1,errno設置為EPIPE
  • 實例

    創建一個從父進程到子進程的管道,并且父進程經由該管道向子進程傳送數據

    #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()函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。