c - dup 和 dup2 命令

标签 c operating-system dup2 dup

我想做的是将 ls 命令的输出放在一个文件中,然后使用 grep 命令从该文件中读取并将其存储在一个新文件中,并根据该文件的内容打印终端上的东西。

所以有以下输出重定向:

1) 从标准输出到称为 oioioi.txt 的文件(用于 ls 命令)
2) 从 oioioi.txt 到 grep.txt(用于 grep 命令)
3) 从 grep.txt 回到终端

这是我的代码:

#include<stdio.h>
#include<sys/wait.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
        //if(!fork())
                //execl("/bin/grep","grep","input","oioioi.txt",0);
        FILE *fp1,*fp2;
        int fd,fd2;
        fp1=fopen("oioioi.txt","w+");
        fp2=fopen("grep.txt","w+");
        fd=fileno(fp1);
        fd2=fileno(fp2);
        char filename[40],id[40],marks[40],filename2[40];
        scanf("%s %s %s",filename,id,marks);
        char *execarg2[]={"ls",0};
        dup2(fd,1); //1st redirection
        //close(1);
        if(!fork())
        {
                execv("/bin/ls",execarg2);
        }
        sleep(1);
        wait(NULL);
        //dup(fd2);
        close(fd);
        dup(1);
        dup2(fd2,1); //2nd redirection
        if(!fork())
        {
                //sleep(1);
                execl("/bin/grep","grep",filename,"oioioi.txt",0);
        }
        sleep(1);
        wait(NULL);
        close(fd2);
        dup2(1,fd2); //3rd one which is the incorrect one
        fscanf(fp2,"%s",filename2);
                printf("%s",filename2);
        if(strcmp(filename2,filename)==0)
                printf("FILE FOUND");

        return(0);
}

我认为第三个是不正确的。但是我也不确定前两个。如果你们能看看我的代码并告诉我哪里出了问题,或者给我一个使用 dup 进行以下重定向的示例,我真的很感激

最佳答案

问题始于您的第一个 dup 调用:dup(fd, 1);。在那一行中,您丢失了终端的标准输出。如果你想 secret 地保留对它的引用,你可以 dup(STDOUT_FILENO); 事先。

随后对 printf 的调用实际上将被重定向到 fd2 而不是 stdout 的原始 fd (1)。

这里可能还潜伏着其他一些问题,但这是我所能理解的(请参阅我对这个问题的评论)。

注意

dup2 的联机帮助页声明它会在必要时关闭新的 fd(第二个 arg),使 close

close(fd2);
dup(1, fd2);

冗余。

关于c - dup 和 dup2 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12959562/

相关文章:

c - 为什么指针变量不显示 100 位数字?

memory - 哪个操作系统给 R 最多的内存?

linux - 创建新的 systemd 服务时,什么时候需要将选项 RemainAfterExit 设置为真?

c - 使用 Execvp、fork 和 pipe 的递归管道函数中的错误文件描述符

有人可以帮我解释一下为什么下面的C程序(系统调用)有这种输出吗?

c - 在 C 中实现 shell - 管道输入具有正确的输出,但退出循环

c - 用 C 构建一个简单的 HTTP 服务器

C 在 void 函数中反转单个字符串中的两个单词

linux - UNIX 环境中高级编程的工作代码 2ed 最好在 Ubuntu/gcc4 上

c - 如何使用 void * 数据创建结构体?