linux c无名管道,Linux C 编程----无名管道PIPE

无名管道PIPE特点:

1.它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)

2.它是一个半双工的通信模式,具有固定的读端和写端。

3.管道也可以看成是一种特殊的文件,对于它的读/写也可以使用普通的 read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

无名管道函数原型:

#include 

int pipe(int filedes[2])

filedes[0]读端:用于从管道中读取数据

filedes[1]写端:用于将数据写入管道

若成功则返回零,否则返回-1,错误原因存于errno中。

错误代码:

EMFILE 进程已用完文件描述词最大量

ENFILE 系统已无文件描述词可用。

EFAULT 参数 filedes 数组地址不合法。

注意:

1.不需要open,直接read/write 等系统调用

2.系统自动删除,进程不需要考虑

3.要先PIPE后fork!!!!

使用原理:

进程调用fork之后,子进程也会得到这两个文件描述符,且操作的是同一个管道。这样就在父子进程之间建立了通信连接。

若父进程关闭写端f[1],子进程关闭读端f[0],那么就建立了一条子进程到父进程的单向管道。类似地,还可以建立一条父进程到子进程的单向管道。

e5b7817254d7540844b9fa0eb88fe112.png

如果父进程在fork之前调用了pipe两次,创建了两条管道,那么可以在之后利用上面的方法建立两条半双工管道,一条从子进程读数据,一条向子进程写数据。这样就相当于建立了父子进程之间的全双工管道。

协同进程(coprocess)就是基于这个方法实现的。

简单的例子:

#include //printf

#include  //fork---pid_t

#include  //fork, pipe

#include  //memset

int  main(void)

{

int n, fd[2];

pid_t pid;

char line[512];

memset(line, 0, 512);

if (pipe(fd) 

{

printf("pipe error");

}

if ((pid = fork()) 

{

printf("fork error");

}

else if (pid > 0)

{

/* parent */

close(fd[0]);

write(fd[1], "hello\n", 13);

}

else

{

/* child */

close(fd[1]);

n = read(fd[0], line, 215);

printf("%s", line);

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值