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

标签 c file-descriptor dup2

当我使用 dup2stdout 首先定向到一个临时文件,然后再定向到一个公共(public)文件时,我遇到了一个问题。这是我的代码的一部分:

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 的外部程序,输出被 dup2 重定向到一个临时文件,这很好用,但是当我用 dup2 重定向之后 stdoutfdArch 并对临时文件运行排序,输出不会重定向到 fdArch

是否存在概念错误或遗漏了什么?

最佳答案

I run an external program called program and the out is redirected with dup2 to a temporal file, well this works fine, but after when I redirect with dup2 the stdout to fdArch and run sort over the temporal file,the out is not redirected to fdArch. Is there an error of concept or something is missing?

您对 dup2() 的使用很好,但是您确实有一个重大错误:execv() 函数不会返回,除非它失败。它及其家族中的所有其他函数替换调用它的程序为指定的程序。因此,实际上您永远不会第二次重定向 stdout 或运行 /bin/sort。如果你想做那些事情,那么你应该 fork(),在子进程中执行 execv(),并让父进程 wait() 让它在继续之前完成。

关于c - 是否可以使用 dup2 将 stdout 重定向两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30812048/

相关文章:

c++ - 是否将索引括号用于指针取消引用它?

C 中的复合运算符 (+=) 和 &&,奇怪的值

c - 管道在c中是如何工作的?

unix - 在不同进程之间传递文件描述符的可移植方式

c - popen2() 如何在 c 中工作?

c - C 中的哲学家就餐使用 fork()

在 C 特殊情况下组合 2 个数组

有人可以修改我的代码吗?我需要读取单个字符串并将其存储到数组中

java - java程序中的文件描述符泄漏: too many open files

c - 使用 fork 的 C 程序中的错误文件描述符