c - 选择 C ​​程序失败,但 shell 不失败

标签 c process select-function

我有一个父进程和子进程,父进程可以读取子进程的输出并将其发送到子进程的输入。到目前为止,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/

相关文章:

Java在线程中处理输入流

c - 即使缓冲区中有数据,select() 也会超时

c - 使用两个 for 循环找到最不频繁的数字?

c - 将整个 unsigned char 数组返回给 main

c - 在阻塞时获取 SIGSEGV 信号

C、socket编程: Connecting multiple clients to server using select()

C - 填充 TCP 套接字发送缓冲区

c - 指针的原因是指向第二种情况下字符串文字的最后一个字符

c - 试图隐藏进程

java - 无法从外部进程读取流