to gateh:
可能我没有说清楚。在M1中已经设置了发送缓冲区和接收缓冲区,当M1接收到数据并且已经把数据放入接收缓冲区后就通过一个信号量通知M2,这样来做接收应该没有什么问题。对于输出我开始只想到:M2准备好数据并放入发送缓冲区后再以某种方式去通知M1,并没有考虑由M1自己检测。多谢你的提醒。今天我又看了下《UNIX Network Programming Volume 1, Third Edition》,参照16.2节,觉得采用由M1检测的方式是可行的。我现在的想法是这样的:
- 使用非阻塞方式并且在M1中:
- if 接收缓冲区不满
- 将相应的通道描述符加入 readset;
- if 发送缓冲区不空
- 将相应的通道描述符加入 writeset;
- select(width, &readset, &writeset, NULL, NULL);
- if 通道有数据可读
- 读入数据并送入接收缓冲区然后设置信号量
- if 通道可写
- 将发送缓冲区的数据输出
复制代码
相应的图改为如后所附
to kj501:
也许我还没能很好的理解你说的方法,但是我觉得用管道还是不好解决数据输出的问题。因为对于输出这里要分两步,如果用管道,首先要判管道中是否有数据,在有数据的情况下还要再判一次通道是否可写。如果用上面的非阻塞模型实现则需要两次循环才能完成一次输出 |