我目前正在C中实现一个shell。 当我尝试运行这样的命令时,我的问题出现了:
SHELL$: sort < txtFile | grep key
我在进程(子进程)中运行sort < txtFile
,在父进程中运行else if(pid > 0)
我正在运行管道右侧的另一个命令。
程序运行正常,但是它退出我在main中设置的无限循环以继续接收来自用户的输入。
我怎么能解决这个问题?
这是我到目前为止处理管道的代码,我没有包含我必须处理重定向的代码:
c2p是我为此设置的管道。
if(pid == 0)
{
if( PIPE_FLAG )
{
close(c2p[0]);
if(dup2(c2p[1], STDOUT_FILENO) == -1){
perror("dup2() failed");
exit(2);
}
}
/* Execute command */
execvp(cmd_args[0], cmd_args);
perror("exec failed 1. "); /* return only when exec fails */
exit(-1);
}
else if(pid > 0)
{
if(PIPE_FLAG)
{
close(c2p[1]);
if(dup2(c2p[0], STDIN_FILENO) == -1){
perror("dup2() failed");
exit(-1);
}
execvp(nxt_args[0], nxt_args);
perror("exec failed 2. ");
exit(-1);
}
}
else
{
/* error occurred */
perror("fork failed");
exit(1);
}
答案 0 :(得分:4)
我正在子进程中运行
sort < txtFile
,而在父进程中我正在运行管道右侧的命令。
然后,您的shell进程会发生什么?父进程是shell。通过在父进程中运行右侧命令,您可以接管shell的进程。请记住,exec()会替换当前进程。
您需要fork()两次,并在子进程中执行管道的两侧。父必须保留shell,然后wait()让子进程退出,然后再显示下一个命令提示符。
答案 1 :(得分:0)
rsync