猿问

在C语言中,如何在执行execvp()或类似调用时将stdin / stdout / stderr

我有以下代码:


pid_t pid = fork();

if (pid == -1)

{

    // ...

}

else if (pid == 0)

{

    stdin = someopenfile;

    stdout = someotherfile;

    stderr = somethirdopenfile;

    execvp(args[0], args);

    // handle error ...

}

else

{

    // ...

}

问题是,execvp()调用的输入/输出仍然是控制台,而不是文件。显然我做错了什么,正确的方法是什么?


qq_花开花谢_0
浏览 1330回答 3
3回答

慕仙森

正确的方法是替换文件描述符STDIN_FILENO,STDOUT_FILENO并STDERR_FILENO使用打开的文件dup2()。然后,您还应该在子进程中关闭原始文件:else if (pid == 0){    dup2(fileno(someopenfile), STDIN_FILENO);    dup2(fileno(someotherfile), STDOUT_FILENO);    dup2(fileno(somethirdopenfile), STDERR_FILENO);    fclose(someopenfile);    fclose(someotheropenfile);    fclose(somethirdopenfile);    execvp(args[0], args);    // handle error ...}

天涯尽头无女友

看一下freopen功能。我必须做类似的事情,stdout并编写了两个对我有用的函数:static int fd;static fpos_t pos;void switchStdout(const char *newStream){  fflush(stdout);  fgetpos(stdout, &pos);  fd = dup(fileno(stdout));  freopen(newStream, "w", stdout);}void revertStdout(){  fflush(stdout);  dup2(fd, fileno(stdout));  close(fd);  clearerr(stdout);  fsetpos(stdout, &pos);}

慕婉清6462132

您可以在stdin,stdout,stderr处于终端状态时使用此命令//change stdin,stdout,stderr    freopen("new_stdin","r",stdin);    freopen("new_stdout","r",stdout);    freopen("new_stderr","r",stderr);    //----do something;//reset stdin,stdout,stderr     freopen("/dev/tty","r",stdin);     freopen("/dev/tty","r",stdout);     freopen("/dev/tty","r",stderr);
随时随地看视频慕课网APP
我要回答