使用dup2(),我可以准备输出到stdout和文件吗?

时间:2019-02-11 19:52:36

标签: c linux tee dup2

static int execute(int retofprev,int firstcmnd,int lastcmnd)
{        
    int pipeends[2];

    pipe( pipeends );    
    processid = fork();

    if (processid == 0) {
        if (firstcmnd == 1 && lastcmnd == 0 && retofprev == 0) {
            dup2( pipeends[1], STDOUT_FILENO );
        } else if (firstcmnd == 0 && lastcmnd == 0 && retofprev != 0) {
            dup2(retofprev, STDIN_FILENO);
            dup2(pipeends[1], STDOUT_FILENO);
        } else {
            dup2( retofprev, STDIN_FILENO );
        }

        if (execvp( arrayofcmnds[0], arrayofcmnds) == -1)
        {    
            printf("%s command not found\n",arrayofcmnds[0]);
            cmndfailed=1;
        }
    }

    commandlog();

    if (retofprev != 0) 
        close(retofprev);

    close(pipeends[1]);

    if (lastcmnd == 1)
        close(pipeends[0]);

    return pipeends[0];
}

在这里,我也想将输出重定向到文件。但是我不知道如何进行。我尝试使用dup2,但是它仅将内容输出到文件,并且在屏幕上不显示任何内容。我希望输出既在屏幕上又在文件中。请帮助

更新:

static int execute(int retofprev,int firstcmnd,int lastcmnd)
{
    int pipeends[2];


    int oldstdout = dup(1);     

    pipe( pipeends );   
    processid = fork();

    int file = open("output.log", O_RDWR | O_APPEND);


    if (processid == 0) {

        if (firstcmnd == 1) {
            dup2( pipeends[1], STDOUT_FILENO );
        } else if (lastcmnd == 0) {
            dup2(retofprev, STDIN_FILENO);
            dup2(pipeends[1], STDOUT_FILENO);
        } else {
            dup2( retofprev, STDIN_FILENO );
            dup2(file,1);   
    }

        if (execvp( arrayofcmnds[0], arrayofcmnds) == -1)
                {   
                    printf("%s command not found\n",arrayofcmnds[0]);
                }

        dup2(oldstdout,1);
        fflush(stdout);     
        close(oldstdout);


    }

    return pipeends[0];
}

所以在这里,我尝试保存原始标准输出并进行了复制。我第一次连接文件,执行命令时,输出将输出到我想要的文件中。然后,我尝试将STDOUT_FILENO重定向到原始stdout,但此时我意识到输出不再可用,并且终端什么也不显示。 我知道tee可以解决问题,但是我在C中提到了tee的实现,但我对此并不了解。一点帮助将不胜感激。谢谢。

0 个答案:

没有答案