进程间通信之管道通信(PIPE匿名管道)

#include<stdio.h>
#include<errno.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char cwrite[1024];
    char cread[1024];
    int fd[2];
    if(pipe(fd))
    {
        perror("pipe");
        exit(errno);
    }
    int pid = fork();
    if(pid>0)
    {
        close(fd[0]);
        //关闭读管道
        sprintf(cwrite,"hello world!!\n");
        write(fd[1],cwrite,strlen(cwrite));
        wait(NULL);
    }
    else if(0 == pid)
    {
    
        close(fd[1]);
        //关闭写管道
        int len = read(fd[0],cread,sizeof(cread));
        write(STDOUT_FILENO,cread,len);
    }
    return 0;
}

pipe管道通信只适用于有血缘关系的进程间通信,不同进程间的通信不适适用匿名的管道通信

pipe管道位于内核空间块,默认大小是64k 可以使用fpathconf(fd[1],_PC_PIPE_BUF)查看

pipe通信默认是阻塞IO的 若要适用非阻塞的 pipe 可以使用

 int flags |= O_NONBLOCK;
 fcntl(fd[1], F_SETFL, flags) 使文件变为非阻塞读

pipe进程通信为单向通信,若要双向通信可以通过在开辟一条管道进行通信。

注意 fd[2]中fd[0]一般情况为3 用作读管道文件描述符,fd[1]一般是4为用作写管道描述符。

注意 若读端关闭,则写端写管道会产生SIGPIPE信号,默认写不进会终止进程。

注意 读端未读管道数据满,写段再写会阻塞。

原创。如有错漏欢迎指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值