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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 进程通信 pipe

發(fā)布時(shí)間:2023/11/30 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 进程通信 pipe 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • pipe函數(shù)
    管道函數(shù)
    man pipe
  • #include <unistd.h> int pipe(int pipefd[2]);參數(shù)介紹:pipefd讀寫文件描述符,0-代表讀, 1-代表寫

    父子進(jìn)程實(shí)現(xiàn)pipe通信,實(shí)現(xiàn)ps aux | grep bash 功能
    經(jīng)常出現(xiàn)的問題:
    父進(jìn)程認(rèn)為寫端存在,就有可能還有人發(fā)送數(shù)據(jù),繼續(xù)等待
    所以盡量保持管道數(shù)據(jù)的流向保持一致,所以先在子進(jìn)程關(guān)閉讀端,
    父進(jìn)程關(guān)閉寫端,這樣管道流向就是 子進(jìn)程寫,父進(jìn)程讀。

    #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <sys/stat.h> #include <fcntl.h>int main() {int fd[2];pipe(fd);pid_t pid = fork();if(pid == 0) {// sonclose(fd[0]);dup2(fd[1], STDOUT_FILENO);execlp("ps", "ps", "aux", NULL);} else if(pid>0){// fatherclose(fd[1]);dup2(fd[0], STDIN_FILENO);execlp("grep", "grep", "bash", NULL);}return 0; }
  • pipe管道的行為
  • 讀管道

    a.寫端全部關(guān)閉, -- read讀到0,相當(dāng)于讀到文件末尾b.寫端沒有全部關(guān)閉b1.有數(shù)據(jù) -- read讀到數(shù)據(jù)b2.沒有數(shù)據(jù) -- read阻塞 (fcntl函數(shù)可以更改為非阻塞)

    寫管道

    a. 讀端全部關(guān)閉, 產(chǎn)生一個(gè)信號(hào),SIGPIPE(kill - 13),程序異常終止b. 讀端沒有全部關(guān)閉b1. 管道已滿 --write阻塞b2. 管道未滿 --write正常寫入,
  • pipe 管道的大小
    通過ulimit -a
  • pipe size (512 bytes, -p) 8
  • pipe 管道缺點(diǎn)
    只能單向通信, 雙向通信需要建立兩個(gè)管道
    只有血緣關(guān)系的進(jìn)程才能通信
  • 兄弟進(jìn)程實(shí)現(xiàn) ps aux | grep bash 功能
  • #include <stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int main() {int fd[2];pipe(fd);pid_t pid;int i=0, n=2;for(i=0; i<n; i++) {pid = fork();if(pid == 0) {break;}}if(i == 0) {close(fd[0]);dup2(fd[1], STDOUT_FILENO);execlp("ps", "ps", "aux", NULL);} else if(i ==1 ) {close(fd[1]);dup2(fd[0], STDIN_FILENO);execlp("grep", "grep", "bash", NULL);} else if(i == 2) {close(fd[0]); close(fd[1]);wait(NULL);wait(NULL);}return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的linux 进程通信 pipe的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。