没有stdout回来

时间:2017-02-10 02:22:47

标签: c stdout dup

此代码获取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;

}

2 个答案:

答案 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()为您执行此操作。