管道的读写特点

1  read读管道,如果管道中没有数据,read默认是带阻塞的

可以设置管道的读端的文件描述符为非阻塞

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <stdlib.h>

#include <sys/types.h>

#include <fcntl.h>

int main(int argc, char *argv[])

{

//创建管道

int fd[2];

//fd[0] 保存管道读端文件描述符

//fd[1] 保存管道写端文件描述符

int ret = pipe(fd);

if(ret < 0)

  perror("");

pid_t pid = fork();

if(pid < 0)

  perror("");

else if( 0 == pid)

{

  char buf[16]="";

  int i=0;

  while(1)

  {

  memset(buf,'a'+i,sizeof(buf)-1);

  i++;

  sleep(1);

  write(fd[1],buf,strlen(buf));

  }

}

else

{

  char buf[16]="";

  //设置fd[0]为非阻塞

  int flag = fcntl(fd[0],F_GETFL);

  flag |= O_NONBLOCK;

  fcntl(fd[0],F_SETFL,flag);


  while(1)

  {

  usleep(200*1000);

  memset(buf,0x00,sizeof(buf));

  //fd[0]文件描述符默认是带阻塞的

  read(fd[0],buf,sizeof(buf));//管道也是一个特殊的文件,默认是带阻塞的

  printf("read data =%s\n",buf);

  }

}


return 0;

}




2 向管道中写数据,如果管道的缓冲区满了,write也会阻塞


#include <stdio.h>

#include <unistd.h>

#include <fcntl.h>

#include <string.h>

int main(int argc, c

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

推荐阅读更多精彩内容

  • 信号信号是linux操作系统进程间通信的一种方式,一个应用进程可以接受、发送信号给另一个进程,当进程捕获到某个信号...
    zhile_doing阅读 506评论 0 0
  • 串口操作 串口操作需要的头文件 #include /*标准输入输出定义*/ #include /*标准函数库定...
    旅行家John阅读 1,402评论 0 3
  • 水平触发模式 -- 默认就是这种模式(如上一篇所写) 边沿阻塞触发模式 边沿非阻塞工作模式 -- 效率最高 先来个...
    wulegekong阅读 896评论 0 1
  • 进程间通信 ipc:interprocess communication 通信方式 管道通信Paste_Image...
    I踏雪寻梅阅读 322评论 0 1
  • 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半相关与全相...
    VD2012阅读 2,460评论 0 5