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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux进程间通信-管道

發布時間:2024/4/14 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux进程间通信-管道 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一?管道的局限性

????管道有兩個局限性:(1)他是半雙工(即數據只能在一個方向上流動)。(2)它只能在具有公共祖先的進程之間使用。一個管道由一個進程創建,然后該 進程調用fork,此后父子進程之間就可該管道。

?

二 管道的創建

? ?用函數pipe創建: #include<unistd.h> int pipe(int files[2]); 參數:filedes返回兩個文件描述符:filedes[0] 為從管道讀而打開,filedes[1]為管道寫而打開。filedes[1]的輸出是filedes[0]的輸入。

三 管道原理圖

如下這張圖可以說明管道的原理,即一個父進程創建一個子進程后,父進程打開寫管道,子進程打開讀管道。

四 管道只有一端時的情況

當管道的一端被關閉后,下列規則起作用: (1) ?當讀一個寫端已被關閉的管道時,在所有數據都被讀取后, read返回0,以指示達到了文件結束處(從技術方面考慮,管道的寫端還有進程時,就不會產生文件的結束。可以復制一個管道的描述符,使得有多個進程具有寫打開文件描述符。但是,通常一個管道只有一個讀進程,一個寫進程。下一節介紹F I F O時,我們會看到對于一個單一的FIFO常常有多個寫進程)。 (2) ?如果寫一個讀端已被關閉的管道,則產生信號 SIGPIPE。如果忽略該信號或者捕捉該信號并從其處理程序返回,則 write 出錯返回,errno設置為EPIPE。 (3) 在寫管道時,常數 PIPE_BUF 規定了內核中管道緩存器的大小。如果對管道進行 write調用,而且要求寫的字節數小于等于 PIPE_BUF,則此操作不會與其他進程對同一管道(或 FIFO )的write操作穿插進行。但是,若有多個進程同時寫一個管道(或?FIFO) ,而且某個或某些進程要求寫的字節數超過?PIPE_BUF字節數,則數據可能會與其他寫操作的數據相穿插。

五 例子

#include <unistd.h> #include <stdio.h> #include <stdlib.h>#define MAXLINE (2014)int main(void) {int n, fd[2];pid_t pid;char line[MAXLINE];if (pipe(fd) < 0)printf("pipe error");if((pid = fork()) < 0)printf("fork error");else if (pid > 0) { /* parent */close(fd[0]);/* close read */printf ("the process pid %d\n", getpid());printf ("the process write to pipe : hello world!\n");write(fd[1], "hello world\n", 12);} else{ /* child */close(fd[1]); /* close write */printf("the process pid %d\n", getpid());n = read(fd[0], line, MAXLINE);write(STDOUT_FILENO, line, n);}exit(0); }

?

轉載于:https://www.cnblogs.com/fangshenghui/p/4039833.html

總結

以上是生活随笔為你收集整理的linux进程间通信-管道的全部內容,希望文章能夠幫你解決所遇到的問題。

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