是否可以使用dup2重定向stdout两次?

时间:2015-06-12 20:57:42

标签: c file-descriptor dup2

当我首先将dup2直接stdout用于临时文件,然后使用公共文件时,我遇到了问题。这是我的代码的一部分:

FILE* fdArch=fopen("file.txt","w");

    char nameBuff[100];

    memset(nameBuff,0,sizeof(nameBuff));

    strncpy(nameBuff,"/tmp/myTmpFile-XXXXXX",sizeof("/tmp/myTmpFile-XXXXXX"));

    int fdNewFile=mkstemp(nameBuff);

    if(fdNewFile==-1){
        perror("error creating temporal file");
    }

    dup2(fdNewFile,STDOUT_FILENO);

    read(fd[0], readbuffer, sizeof(readbuffer));

    char *argv[]={ "/home/user/workspace/CProgram/Debug/program", readbuffer, NULL};

    execv(argv[0],argv);

    close(fdNewFile);

    dup2(fileno(fdArch),STDOUT_FILENO);

    char *argv1[]={"/usr/bin/sort",nameBuff, NULL};

    execv(argv1[0],argv1);

    fclose(fdArch);

    unlink(nameBuff);

我运行一个名为program的外部程序,out用dup2重定向到一个临时文件,这很好用,但是当我用dup2 stdout重定向到{ {1}}并对临时文件运行排序,out不会重定向到fdArch

是否存在概念错误或缺少某些内容?

1 个答案:

答案 0 :(得分:2)

  

我运行一个名为program的外部程序,out用dup2重定向到一个临时文件,这很好用,但是当我用dup2将stdout重定向到fdArch并在temporal文件上运行sort时,out不是重定向到fdArch。是否存在概念错误或缺少某些内容?

您对dup2()的使用很好,但确实存在重大错误:execv()函数不会返回,除非它失败。它以及其系列中的所有其他函数替换使用指定的程序调用它的程序。因此,实际上您永远不会再次重定向stdout或运行/bin/sort。如果您想要执行这些操作,那么您应该fork(),在子流程中执行execv(),并让父级wait()完成,然后再继续。