linux无名管道

1管道(无名管道)介绍

int pipe(int fd[2]); //成功返回0,失败返回-1;
pipefd[0]元素的描述符为管道读端,
只能用来读;pipe[1]元素的描述符为管道写端,只能用来写。
在使用管道时,应该将对自己来说没有的一端关闭close(),然后再使用自己需要的一端read()或write()

2 管道读写规则

当没有数据可读时

  • O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。
  • O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。

当管道满的时候

  • O_NONBLOCK disable: write调用阻塞,直到有进程读走数据
  • O_NONBLOCK enable:调用返回-1,errno值为EAGAIN

如果所有管道写端对应的文件描述符被关闭,则read返回0

如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE

当要写入的数据量不大于PIPE_BUF时,Linux将保证写入的原子性。

当要写入的数据量大于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非阻塞方式

当管道中的数据被读取后,管道为空。一个随后的read()调用将默认的被阻塞,等待某些数据写入。

若需要设置为非阻塞,则可做如下设置:

    fcntl(filedes[0], F_SETFL, O_NONBLOCK);
    fcntl(filedes[1], F_SETFL, O_NONBLOCK);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 管道通信 进程间管道通信方式可以通过man 7 pipe来查看; 匿名管道 单工管道 打开管道:使用popen()...
    秋风弄影阅读 743评论 0 0
  • 本文摘抄自linux基础编程 管道指的是从一个进程连接数据流到另一个进程。它具有以下特点: 管道是半双工的,数据只...
    lintong阅读 3,572评论 0 8
  • 命名管道 (有用的特点): 由于它们出现在文件系统中,所以他们可以像平常的文件名一样在命令中使用。在创建的FIFO...
    helinyu阅读 1,238评论 0 1
  • “懂得分享的人生才会走的更精彩”,今天把它给分享给创业的读者。就个人经验而言,越是懂得分享的人,所聚集的能量越强,...
    筱梦同行me阅读 778评论 0 0
  • 微雨霏霏 无人能知此伤悲 浪一路流的泪 北风已刮飞 曾最厌惧的天黑 成了唯一能伴你的鬼魅
    吾羡少君曾倾酒阅读 194评论 0 0