【发布时间】:2016-07-09 10:55:47
【问题描述】:
我的 mini-shell 程序接受管道命令,例如,ls -l | wc -l,并使用 excevp 来执行这些命令。
我的问题是,如果没有用于 execvp 的 fork(),管道命令运行良好,但 shell 随后终止。如果 execvp 有一个 fork(),就会发生死循环。而且我无法修复它。
代码:
void run_pipe(char **args){
int ps[2];
pipe(ps);
pid_t pid = fork();
pid_t child_pid;
int child_status;
if(pid == 0){ // child process
close(1);
close(ps[0]);
dup2(ps[1], 1);
//e.g. cmd[0] = "ls", cmd[1] = "-l"
char ** cmd = split(args[index], " \t");
//if fork here, program cannot continue with infinite loop somewhere
if(fork()==0){
if (execvp(cmd[0],cmd)==-1){
printf("%s: Command not found.\n", args[0]);
}
}
wait(0);
}
else{ // parent process
close(0);
close(ps[1]);
dup2(ps[0],0);
//e.g. cmd[0] = "wc", cmd[1] = "-l"
char ** cmd = split(args[index+1], " \t");
//if fork here, program cannot continue with infinite loop somewhere
if(fork()==0){
if (execvp(cmd[0],cmd)==-1){
printf("%s: Command not found.\n", args[0]);
}
}
wait(0);
waitpid(pid, &child_status, 0);
}
}
我知道 excevp 需要 fork() 才能不终止 shell 程序,但我仍然无法修复它。任何帮助将不胜感激,谢谢!
我应该如何让两个孩子平行?
pid = fork();
if( pid == 0){
// child
} else{ // parent
pid1 = fork();
if(pid1 == 0){
// second child
} else // parent
}
这是正确的吗?
【问题讨论】:
-
你是
fork()ing 两次。不清楚第一个孩子(第二个孩子的父母)在wait()s 之后对其孩子做了什么,因为它只是从这个函数返回。发布更多代码或解释为什么你fork()两次。 -
注意
dup2()会自动关闭新的文件描述符,如果它已经打开,所以没有必要先close()那个FD。如果你知道 FD 是打开的,那么这样做并没有错,但首先显式关闭它确实会插入一个额外的函数调用,你应该检查它的返回值。