如何将stdin(特定文件名)重定向到stdout(特定文件名)

时间:2015-04-08 03:15:18

标签: c shell unix dup2

我正在创建一个shell代码。基本上,我想将stdin文件重定向到stdout文件。例如,当我输入类似sort<的命令时hello.c> t.txt,然后应将hello.c文件复制到名为t.txt的新提到的文件中。

这是我的代码,当我输入ls>时,我能够重定向其他命令的输出。 t.txt。但是,我不知道使用dup2将一个文件的输入重定向到其他文件。

这是我的代码,我只发布循环,因为这是我必须创建逻辑的地方。

int in, out;

for (i = 0; i < arridx; i++) {
    if(strcmp( array[i],"<")==0)
    {    
             in = open(array[i+1], O_RDONLY);        
             array[i]=0;
            // array[i+1]=0;
    }
    if(strcmp( array[i],">")==0)
    {
              out = open(array[i+1], O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR);
              array[i]=0;
             // array[i+1]=0;
    }
}
dup2(in, 0);
dup2(out, 1);

// close unused file descriptors
close(in);
close(out);

输入数组就像

array[0]="sort"
array[1]="<"
array[2]="hello.c"
array[3]=">"
array[4]="t.txt"

1 个答案:

答案 0 :(得分:1)

事实上,无论何时你运行如下:

command < hello.c > t.txt

重定向将发生,假设命令是您的argv [0],没有参数为1,并且重定向由shell发生。

然而,另一方面,如果使用重定向,则通过您的程序 不是从命令提示符,而是仅通过数组内容, int dup2(int oldfd, int newfd); - 创建文件描述符oldfd的副本。 在你的情况下,

dup2(in, 0);
dup2(out, 1);

0和1分别代表stdin和stdout文件描述符。所以,如果你想将你的输入重定向到stdin而不是hello.c(文件打开为),输出从stdout取而不是t.txt(文件打开为out),那么就应该'其他方式即是

dup2(0, in);
dup2(1, out);
相关问题