#include<stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
int main()
{
int fd[2];
if(pipe(fd)<0)
{
return -1;
}
int pid = fork();
if (pid == 0)
{
char *str="niaho zhongguo";
sleep(12);
int res = write(fd[1], str, strlen(str));
if(res < 0)
printf(" write fail");
else
printf(" write ok");
exit(-1);
}
///sleep(12);
char *buff = (char *)malloc(sizeof(char)*1024);
assert(buff!=NULL);
int ret;
ret = read(fd[0],buff,1024);
if (ret < 0)
printf("read error");
else
printf("%s", buff);
return 0;
}
常说管道是半双工的,但是又说管道只能单向通信,在网络中定义半双工是双方都可以通信,但是不能同时发送消息,而单工是只能有一个方向的通信而没有反方向的交互。难道说是linux下的单工,半双工定义不同。
如果在一个进程中开辟两个管道,则可以实现双方的通信,则就是名义上的半双工。
有名管道和无名管道的区别:
管道中的数据都是有大小限制的,65536个字节。有名管道可以任意两个进程之间通信,无名管道只能有亲缘关系的进程间通信。管道间所传递的是无格式字节流,所以需要两个进程之间确定好数据的大小。管道中的数据只存在于内存中。
本文通过一个C语言示例程序详细介绍了Linux下管道通信的工作原理。包括如何使用pipe()函数创建管道,fork()创建子进程,以及write()和read()进行数据交换。文章还探讨了管道的半双工特性,并对比了有名管道和无名管道之间的区别。
2890

被折叠的 条评论
为什么被折叠?



