我正在尝试编写一个简单的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?任何链接或信息将不胜感激。
答案 0 :(得分:2)
在Unix上,您通常需要dup2
。有关复制文件描述符的信息,请参阅libc docs。
答案 1 :(得分:2)
在分叉过程中,就在exec
新映像之前,关闭文件处理0(stdin),1(stdout)和可能2(stderr)。
然后使用open()
以正确的顺序打开必要的文件(stdin,out和err)。它们将使用文件句柄表中的第一个条目 - 0,1和2.因此,从现在开始,您打开的第一个文件将被视为stdin
。