Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 中断从fifo通道读取的while循环_C_Unix_While Loop_Fifo - Fatal编程技术网

C 中断从fifo通道读取的while循环

C 中断从fifo通道读取的while循环,c,unix,while-loop,fifo,C,Unix,While Loop,Fifo,我必须在UNIX中模拟C程序中的shell行为,记住一件重要的事情:父进程接收所有命令并将它们发送给子进程。然后,子级执行接收到的命令,然后将输出发送给父级。 我的想法是从父级和主子级fork接收命令,以便其自己的子级可以执行该命令并将输出发送到fifo管道。问题是我无法中断while循环,该循环打印正确的输出: mkfifo("output",S_IFIFO|0644); while(read(fifod2,&c,1)) printf("%c",c); 我意识到fifo的

我必须在UNIX中模拟C程序中的shell行为,记住一件重要的事情:父进程接收所有命令并将它们发送给子进程。然后,子级执行接收到的命令,然后将输出发送给父级。 我的想法是从父级和主子级fork接收命令,以便其自己的子级可以执行该命令并将输出发送到fifo管道。问题是我无法中断while循环,该循环打印正确的输出:

mkfifo("output",S_IFIFO|0644);
while(read(fifod2,&c,1))
      printf("%c",c);
我意识到fifo的大小是可变的,但第二个子级必须在终止时发送EOF,因此当读取到达它时,返回0。但这似乎没有发生。 如果需要,请询问我更多的代码部分。
谢谢

因为父级用O_RDWR打开了其fifo的结尾,所以有一个进程在任何时候都有一个可写入fifo的文件描述符。EOF仅在fifo中没有可写fd时发生,因此由于父进程保持可写fd处于打开状态,因此它永远不会获得EOF


尝试在父级中仅使用O_RDWR打开。

主子级代码:int fifod2=openoutput,O_RDWR;次要子代码是相同的…父代码不知道管道。@IonutGoldan,这还不够。要确定这是否是实际情况,我需要查看从第一次调用open到fork,再到上面打印的循环的整个代码路径。如果你不知道出了什么问题,不要删除99%的程序,因为在这个过程中完全有可能删除错误;execvp*argum,argum;这是第二个孩子做的,我不能把我的代码放到网上,因为这是一个家庭作业项目。上面的代码让我困惑:第二个孩子是在execvp之后发送EOF还是否?解析命令或执行命令绝对没有问题…只是读取继续进行,没有停止,只返回严格的正值…并且当所有写入文件句柄关闭时发送EOF。或者更准确地说,如果在没有数据等待且没有写入文件句柄的情况下尝试读取,则会得到EOF。读取可能失败,状态为-1表示错误。这并没有打破循环。在这种情况下,您应该测试while readfifod,&c,1==1,尽管您可能应该使用批量输入:while nbytes=readfifod,buffer,sizeofbuffer>0来一次处理尽可能多的数据。这不会等待FIFO填满;它返回的“短读”字节数将比指定的最大字节数少(如果可用的话)。它将减少系统的负载-单字节I/O是可行的,但它不是有效的,尽管它也不是非常低效;它不会打开它进行阅读或写作。正如bdonlan所建议的,如果在任何进程中FIFO上打开了一个可写文件描述符,则可能会出现在FIFO上无法获取EOF的问题。在实际打开FIFO的位置以及如何打开FIFO时要非常小心。