Linux的pipe为啥只能单向通信有没有方法突破这个限制( 二 )


■网友
泻药。那来看下linux的实现好了。
数据只能单向移动的意思是FIFO,于是linux中实际构建了一个循环队列。
具体一点则是,申请一个缓冲区,作为pipe()操作中匿名管道文件实体,缓冲区设俩指针,一个读指针,一个写指针,并保证读指针向前移动不能超过写指针,否则唤醒写进程并睡眠,直到读满需要的字节数。同理写指针向前也不能超过读指针,否则唤醒读进程并睡眠,直到写满要求的字节数。
pipe()返回的两个文件句柄最后指向的其实是一个inode,只不过一个是read only一个是write only.
试想同时两个进程读的后果,由于i_count会等于2——如果小于2则说明两个进程同时关闭了写句柄,因此会直接退出读函数。此时俩进程会分别认为对方才是写者而反复醒来,反复监测,然并卵没有数据,于是反复睡眠。
如果有多个进程,俩进程同时读,会造成数据混乱,因为读指针只有一个,而你不能保证读写的顺序。
全双工指的是我读的时候可以写,写的时候还可以读,方法很简单,创建两条管道就可以了。

■网友
谢邀,
看标签里有C/C++,我猜你需要 socketpair(3): create pair of connected sockets 这个?
如果是在shell里, 那就
mkfifo pipeprog1 \u0026lt; pipe | pipe \u0026gt; prog2至于Linux为啥只能单向我也不知道。。。Solaris就可以双向。。。

■网友
1 #include \u0026lt;stdlib.h\u0026gt; 2 #include \u0026lt;unistd.h\u0026gt; 3 #define MAXLINE 80 4 5 int main(void) 6 { 7 int n; 8 int fd; 9 pid_t pid; 10 char line; 11 12 if (pipe(fd) \u0026lt; 0) { 13 perror("pipe"); 14 exit(1); 15 } 16 if ((pid = fork()) \u0026lt; 0) { 17 perror("fork"); 18 exit(1); 19 } 20 if (pid \u0026gt; 0) { /* parent */ 21 write(fd, "hello world\", 12); 22 sleep(1); 23 n = read(fd, line, MAXLINE); 24 write(STDOUT_FILENO, line, n); 25 wait(NULL); 26 } else { /* child */ 27 n = read(fd, line, MAXLINE); 28 write(fd, "world\", 6); 29 30 write(STDOUT_FILENO, line, n); 31 } 32 return 0; 33 }代码大部分来自(http://docs.linuxtone.org/ebooks/C\u0026amp;CPP/c/ch30s04.html)
【Linux的pipe为啥只能单向通信有没有方法突破这个限制】 似乎突破了限制。不过我也是新手


推荐阅读