繁体   English   中英

dup和dup2命令

[英]dup and dup2 commands

我想做的是将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); 在那一行,您将失去标准输出到终端。 如果您想秘密地对其进行引用,则可以使用dup(STDOUT_FILENO); 预先。

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

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

b

dup2的联机帮助页指出,如有必要,它将关闭新的fd(第二个arg),使close

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

多余的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM