linux無名管道

1管道(無名管道)介紹

int pipe(int fd[2]); //成功返回0,失敗返回-1;
pipefd[0]元素的描述符為管道讀端,
只能用來讀;pipe[1]元素的描述符為管道寫端,只能用來寫。
在使用管道時,應(yīng)該將對自己來說沒有的一端關(guān)閉close(),然后再使用自己需要的一端read()或write()

2 管道讀寫規(guī)則

當(dāng)沒有數(shù)據(jù)可讀時

  • O_NONBLOCK disable:read調(diào)用阻塞,即進程暫停執(zhí)行,一直等到有數(shù)據(jù)來到為止。
  • O_NONBLOCK enable:read調(diào)用返回-1,errno值為EAGAIN。

當(dāng)管道滿的時候

  • O_NONBLOCK disable: write調(diào)用阻塞,直到有進程讀走數(shù)據(jù)
  • O_NONBLOCK enable:調(diào)用返回-1,errno值為EAGAIN

如果所有管道寫端對應(yīng)的文件描述符被關(guān)閉,則read返回0

如果所有管道讀端對應(yīng)的文件描述符被關(guān)閉,則write操作會產(chǎn)生信號SIGPIPE

當(dāng)要寫入的數(shù)據(jù)量不大于PIPE_BUF時,Linux將保證寫入的原子性。

當(dāng)要寫入的數(shù)據(jù)量大于PIPE_BUF時,linux將不再保證寫入的原子性。

3測試代碼

#include<sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
int main(void)
{
    int pip_fd[2];
    pid_t pid;
    char buf_r[100];
    char *buf_w;
    int r_num;
    if(pipe(pip_fd)<0)
    {
        printf("pipe create fail \n");
        exit(1);
    }
    
    if((pid=fork())==-1)
    {
       printf("fork fail \n");
        exit(1);
        
    }else if(0==pid)//子進程
    {
       close(pip_fd[0]);
       printf("write pip sleep 3 sec *****************************\n");
       sleep(3);
        if(-1!=write(pip_fd[1],"hello 123",strlen("hello 123")))
        {
            printf("write hello 123 \n");
        }
        if(-1!=write(pip_fd[1],"ok get 456",strlen("ok get 456")))
        {
            printf("write ok get 456 \n");
        }
        close(pip_fd[1]);
        printf("writed *****************************\n");
        exit(0);
        
    }else
    {
         close(pip_fd[1]);
       
         printf("start read====================\n ");
         if((r_num=read(pip_fd[0],buf_r,100))>0)
         {
             
            printf("read len :%d -%s\n",r_num,buf_r); 
         }
         close(pip_fd[0]);
         printf("have  readed====================\n ");
         exit(0);
    }
    
    
}


4非阻塞方式

當(dāng)管道中的數(shù)據(jù)被讀取后,管道為空。一個隨后的read()調(diào)用將默認的被阻塞,等待某些數(shù)據(jù)寫入。

若需要設(shè)置為非阻塞,則可做如下設(shè)置:

    fcntl(filedes[0], F_SETFL, O_NONBLOCK);
    fcntl(filedes[1], F_SETFL, O_NONBLOCK);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 管道通信 進程間管道通信方式可以通過man 7 pipe來查看; 匿名管道 單工管道 打開管道:使用popen()...
    秋風(fēng)弄影閱讀 780評論 0 0
  • 本文摘抄自linux基礎(chǔ)編程 管道指的是從一個進程連接數(shù)據(jù)流到另一個進程。它具有以下特點: 管道是半雙工的,數(shù)據(jù)只...
    lintong閱讀 3,657評論 0 8
  • 命名管道 (有用的特點): 由于它們出現(xiàn)在文件系統(tǒng)中,所以他們可以像平常的文件名一樣在命令中使用。在創(chuàng)建的FIFO...
    helinyu閱讀 1,332評論 0 1
  • “懂得分享的人生才會走的更精彩”,今天把它給分享給創(chuàng)業(yè)的讀者。就個人經(jīng)驗而言,越是懂得分享的人,所聚集的能量越強,...
    筱夢同行me閱讀 897評論 0 0
  • 微雨霏霏 無人能知此傷悲 浪一路流的淚 北風(fēng)已刮飛 曾最厭懼的天黑 成了唯一能伴你的鬼魅
    吾羨少君曾傾酒閱讀 207評論 0 0

友情鏈接更多精彩內(nèi)容