Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 重定向子进程的IO_C_Linux_Stdio_Io Redirection - Fatal编程技术网

C 重定向子进程的IO

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");

我写了一个重定向子进程IO的程序。我遇到的问题是,新的stdout和stderr不是直接写入文件,而是在内存中缓冲。我试图用setvbuf解决这个问题,但没有成功

函数返回时没有错误

这是相当令人沮丧的,因为我在以前的实现中删除了缓冲,但不知何故丢失了文件。无论如何,我不确定setvbuf为什么不能解决我的问题

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的调用,然后是上面的代码。当我明天醒来时,我可以提供更多的反馈。我不能从孩子的过程中改变它,这不是我想要的设计的一部分,谢谢,这是有效的。我可能会使用一个伪终端