《Linux C程序设计大全》中遇到滴一个小问题

来源:互联网 发布:杭州知味观礼盒 编辑:程序博客网 时间:2024/05/01 08:11

     在《Linux C程序设计大全》——第十四章的进程间通信的——14.2.3的匿名半双工管道的读写操作这一小节中有这样的一段话:“如果要建立一个父进程到子进程的数据通道,可以先调用pipe函数紧接着调用fork函数,由于子进程自动继承父进程的数据段,则父子进程同时拥有管道的操作权,此时管道的方向取决于用户怎么维护该管道,…,当用户想要一个父进程到子进程的数据通道时,可以在父进程中关闭管道的读出端,相应的在子进程中关闭管道的输出 端”。

       对这段话的最后几句有点疑问:为什么是说:“在父进程中关闭管道的读出端,相应的在子进程中关闭管道的输出端”?。作者的意图可能是想要一个从父进程到子进程的单向流通的数据管道。如果作者没有笔误,那么作者的意思可不可以这样理解:在该段话中,父子进程是共同拥有在子进程创建前的那个无名管道,而且父子进程对这个管道都有在写入端与读出端的操作的权限,那么父进程中关闭管道的读出端,则在父进程中只存在向该管道写入数据的操作,这是我们想要的;在子进程中关闭管道的输出端,如果输出端就是读出端,那么在子进程中也只存在向该管道写的操作,在这里是不对的,有两个进程向同一个管道写入数据而没有数据的读出,必然存在写操作失败(当管道里面的数据达到管道能容纳的大小时,就不能再向管道中写入数据了),如此则达不到我们想要的结果。在这里得说明一下:这个管道到底是怎么维护的?也就是说:上面所说的内容中的无名的管道是不是这样的:在父子进程中都存在一个无名的管道,而这两个无名的管道是彼此相通的(如:父进程的读端连接子进程的写端);还是有另外的意思:这个无名的管道是同时连接父子进程的,也就是始终只有一个先前创建的管道,无论父进程还是子进程都可以在这个管道上进行相应的操作(但不能同时操作)。如果是前者,则那样就不用那么麻烦地去同时维护两个进程的管道;也或者是通过在父进程中关闭父进程的读端(因为子进程继承了父进程的数据段,那么子进程是否有权限对父进程中那个无名管道进行读写的操作呢?),在子进程中关闭子进程的写端,达到彼此相通的呢?如果是这样那就对了,但在此处可能还是有待商榷滴。如果是后者那么也有可能正确:因为父子进程同时拥有对这个无名管道进行读写的操作权限,所以如果想要一个从父进程到子进程的数据流,就可以在父进程中关闭父进程对这个管道的读操作,在子进程中关闭子进程对这个管道的写操作,那么一切都好说了。这样说来的话那么上面所说这两个意思就一样了。具体的细节内容,可以去查找了相关的资料,去了解一下进程间通信中匿名半双工管道的维护与父子进程数据段维护的相关问题。在这里我只是提出一点个人想法而已。有兴趣的可以自己去查阅一下。

       那么如果作者这里有笔误呢,如果是这样的呢:“在父进程中关闭管道的读出端,相应的在子进程中关闭管道的写入端”那么就可能正确了,这还待求证才能判断。

原创粉丝点击