3

我有一个父子进程,父进程可以读取子进程的输出并发送到子进程的输入。到目前为止,使用 shell 脚本,测试输入和输出数据的命令一切正常。我刚刚用一个简单的 C 程序进行了测试,但无法让它工作。这是C程序:

#include <stdio.h>

int main( void ) {
  char stuff[80];
  printf("Enter some stuff:\n");
  scanf("%s", stuff);

  return 0;
}

C 程序的问题是我的选择无法从子 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,所以我无法访问它。

4

2 回答 2

2

问题是子进程正在完全缓冲输出,因为它正在写入管道而不是终端。用于setvbuf强制行缓冲或无缓冲模式,或者fflush在 then 之后给子进程添加一个显式printf,或者使用 Expect 附带的unbuffer程序来欺骗子进程的 libc 使其认为程序是交互工作的。

于 2010-05-03T09:50:41.717 回答
1

在阻止 C 程序中的输入之前刷新您的标准输出。

fflush(stdout);

在 shell 中,这通常是隐含的。

或者,您可以使用setvbuf()禁用缓冲(或启用行缓冲)。这必须在写入任何数据之前调用:

setvbuf(stdout, NULL, _IONBF, 0)
于 2010-05-03T09:49:35.897 回答