我正在尝试开发一个简单的Unix shell模拟。我认为我目前停留的部分是了解execvp
的工作方式。我试图对此进行一些研究,但运气不佳。
基本上,我正在使用fork()
和管道创建子进程。我将STDOUT
重定向到管道的写入fd
。最后,我从子进程中调用我的execvp
。我的execvp()
调用只是一个输出简单字符串的程序。
然后,我尝试从父级读取此字符串,并将其用作第二个execvp()
程序的输入。该程序仅输出其读入的内容。
我遇到的问题是从execvp()
调用了我的第一个程序,然后它只是将字符串直接输出到终端。
我想我的问题是,是否创建了用execvp()
执行的程序而不携带程序的STDOUT
(我的管道写结束)?如果没有,我将如何强制将其写入管道而不是终端?我可以将我的execvp
放在写呼叫中吗?
else if(commandLine[i] == "|"){
pid_t pid2;
pid2 = fork();
t = i;
if (pid2 == 0){ // in child of child
close(pipe1fd[0]);
dup2(pipe1fd[1], STDOUT_FILENO);
execvp(commandLine[i-1], commandLine);
}
else{
close(pipe1fd[1]);
dup2(pipe1fd[0], STDIN_FILENO);
wait(0);
execvp(commandLine[i+1], commandLine);
goto BACK;
}
}