C 重定向子进程的IO
我写了一个重定向子进程IO的程序。我遇到的问题是,新的stdout和stderr不是直接写入文件,而是在内存中缓冲。我试图用setvbuf解决这个问题,但没有成功 函数返回时没有错误 这是相当令人沮丧的,因为我在以前的实现中删除了缓冲,但不知何故丢失了文件。无论如何,我不确定setvbuf为什么不能解决我的问题C 重定向子进程的IO,c,linux,stdio,io-redirection,C,Linux,Stdio,Io Redirection,我写了一个重定向子进程IO的程序。我遇到的问题是,新的stdout和stderr不是直接写入文件,而是在内存中缓冲。我试图用setvbuf解决这个问题,但没有成功 函数返回时没有错误 这是相当令人沮丧的,因为我在以前的实现中删除了缓冲,但不知何故丢失了文件。无论如何,我不确定setvbuf为什么不能解决我的问题 if (!freopen(DBGD_CHILD_STDOUT, "w", stdout)){ perror ("Couldn't open new child-stdout");
if (!freopen(DBGD_CHILD_STDOUT, "w", stdout)){
perror ("Couldn't open new child-stdout");
exit (-1);
}
if (!freopen(DBGD_CHILD_STDERR, "w", stderr)){
perror ("Couldn't open new parent-stderr");
exit (-1);
}
if (setvbuf (stdout, 0, _IONBF, 0)){
perror ("Couldn't change buffering mode of stdout");
exit (-1);
}
if (setvbuf (stderr, 0, _IONBF, 0)){
perror ("Couldn't change buffering mode of stderr");
exit (-1);
}
if (execv (ProcessArgs[0], &ProcessArgs[1]) < 0){
perror ("Couldn't execute process");
exit (-1);
}
很难从您的描述和小代码块中判断实际发生了什么 但是,在execv之前更改缓冲区的尝试将无效,因为进程将作为一个整体被替换,包括libc stdio状态。您需要更改已执行子进程中的缓冲
如果您不能控制孩子,那么您可以使用执行它。也许这会有所帮助:谢谢。我将展示一个没有setvbuf的实现,这是我以前尝试过的。@Michael实际上,我可能会尝试使用一个伪终端——正如这个问题所提出的那样。让我进一步调查一下,你能把你所有的代码都发出去吗?我明天早上可以。基本上是从入口点开始的:有一个fork、chdir和对stdin的pipe和dup2的调用,然后是上面的代码。当我明天醒来时,我可以提供更多的反馈。我不能从孩子的过程中改变它,这不是我想要的设计的一部分,谢谢,这是有效的。我可能会使用一个伪终端