非内置命令的简单shell程序unix文件重定向

时间:2011-02-03 05:02:38

标签: c linux shell unix redirect

我正在尝试编写一个简单的shell程序,并且遇到非内置命令的文件重定向问题。例如./a.out< infile> outfile,将用户编译的程序a.out从infile获取输入并将其输出输出到outfile而不是它通常使用的流。当我遇到非内置命令时,我会分叉一个新进程并使用提供的参数覆盖新图像。一般格式是命令arg1 arg2 ... argn< infile> OUTFILE。因此,args(arg1到argn)将在新图像中传递,输入和输出将更改为infile和outfile这是我的分叉过程的片段。

pid = fork();

if (pid < 0) {
   fprintf(stderr, "*** fork error ***\n");
} else if (pid == 0) {
   execvp(command, args);
}

waitpid(pid, &status, 0);

是否有允许我这样做的unix命令?我还在想,在新的图像中可能有办法改变stdin和stdout?任何链接或信息将不胜感激。

2 个答案:

答案 0 :(得分:2)

在Unix上,您通常需要dup2。有关复制文件描述符的信息,请参阅libc docs

答案 1 :(得分:2)

在分叉过程中,就在exec新映像之前,关闭文件处理0(stdin),1(stdout)和可能2(stderr)。

然后使用open()以正确的顺序打开必要的文件(stdin,out和err)。它们将使用文件句柄表中的第一个条目 - 0,1和2.因此,从现在开始,您打开的第一个文件将被视为stdin