我有一个父进程和子进程,父进程可以读取子进程的输出并将其发送到子进程的输入。到目前为止,shell 脚本一切正常,测试输入和输出数据的命令。我只是用一个简单的 C 程序进行了测试,但无法让它工作。这是 C 程序:
#include <stdio.h>
int main( void ) {
char stuff[80];
printf("Enter some stuff:\n");
scanf("%s", stuff);
return 0;
}
C 程序的问题是我的 select 无法从子 fd 中读取,因此程序无法完成。这是执行选择的部分..
//wait till child is ready
fd_set set;
struct timeval timeout;
FD_ZERO( &set ); // initialize fd set
FD_SET( PARENT_READ, &set ); // add child in to set
timeout.tv_sec = 3;
timeout.tv_usec = 0;
int r = select(FD_SETSIZE, &set, NULL, NULL, &timeout);
if( r < 1 ) { // we didn't get any input
exit(1);
}
有人知道为什么 C 程序而不是 shell 程序会发生这种情况吗?
编辑:我应该指出,子进程在参数上调用 exec,因此我无法在该点之后访问它。
最佳答案
问题在于子进程完全缓冲了输出,因为它正在写入管道而不是终端。使用 setvbuf
强制行缓冲或无缓冲模式,或者在 printf
之后向子级添加显式 fflush
,或者使用 unbuffer Expect 附带的程序会欺骗子进程的 libc,使其认为该程序正在交互工作。
关于c - 选择 C 程序失败,但 shell 不失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2757201/