我有以下代码:
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()调用的输入/输出仍然是控制台,而不是文件。显然我做错了什么,正确的方法是什么?
execvp()
正确的方法是替换文件描述符STDIN_FILENO,STDOUT_FILENO并STDERR_FILENO使用打开的文件dup2()。然后,您还应该在子进程中关闭原始文件:
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 ... }