此代码获取2个文件并将结果放入第三个文件。 它做得很好,但引起我担心的是最后一个printf没有打印到屏幕上。第一个打印就好了。这告诉我,我没有正确恢复标准输出?
int main (int argc, char *argv[])
{
char *join[4]={"cat", "file1.txt","file2.txt", 0};
int id, fd, status;
printf("fd=%d\n", fd); //this one prints to screen
fd=dup(1); //save stdout
close(1); close stdout
FILE *out=fopen("output.c", "a"); //this is where the output should go
id=fork(); //0 for child
if (id>0) //parent process
{
waitpid(id, &status, WUNTRACED);
}
else if (id==0) //child process
{
execvp(join[0], join);
}
else //error
{
printf("error occured");
}
close(1);
dup2(fd, 1);
fclose(out);
printf("fd=%d\n", fd); //this one doesn't print to screen
return 0;
}
答案 0 :(得分:3)
您需要保存stdout
,以便日后再恢复。
// save stdout
int sv_stdout = dup(STDOUT_FILENO);
// close stdout
close(STDOUT_FILENO);
// do stuff
// restore stdout
dup2(sv_stdout, STDOUT_FILENO);
答案 1 :(得分:0)
execvp
永远不会回来。您的流程将由cat
流程替换。当该进程退出时,您将获得shell提示符。请参阅exec
的手册页。 Google是fork
/ exec
的示例,了解如何运行多个流程。或者使用system()
为您执行此操作。