我想用管道和信号制作一个REPL风格的程序,但我的程序锁定

时间:2011-10-24 10:52:48

标签: c posix signals fifo

程序应该fork,然后父进程应该读取用户输入,发送给子进程;孩子应该处理它,然后将结果发送给打印它的父母(它需要以这种方式工作)。

我已经完成了它的一部分,但程序在第一次从fifo读取后锁定。

我怀疑问题出在第122-199行之间。使管道无阻塞使程序在185处跳过scanf并无限循环。在写入之前和读取之后关闭并重新打开管道会产生相同的效果。

以下是来源:link


稍后编辑(澄清):

父项在184的printf之前阻塞,当它读取第二个命令时(第一次看起来工作得很好)。

我没有实现“孩子把东西送回父母”部分。目前我只想让子输出通过父管道收到的数据,然后将控制权交还给父级以读取另一个命令。

当父母读取输入并通过管道发送输入时,孩子处于暂停状态(pause()),然后它唤醒孩子并进入暂停状态。孩子从管道中读取数据并将其输出,然后唤醒父母并进入睡眠状态。

2 个答案:

答案 0 :(得分:0)

你应该澄清你的问题,它与部分(父母或孩子)锁定。

确保所有输出都是换行终止。似乎(从快速阅读)你使用puts(),这应该照顾。

在客户端完成后尝试在输出上调用fflush(),以确保输出被写入管道,如果子节点在父节点读取其输出时仍然存在。我没有仔细阅读你的代码来追踪生命周期处理。

答案 1 :(得分:0)

您是否使用了一些多路复用系统调用,例如selectpoll,它们能够测试一组文件描述符,其中有一些准备就绪(输入或输出)?

详细了解poll或关于select和朋友。