gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:13:42 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com