我试图用C实现一个shell 我目前正试图处理程序的管道而没有运气。我想知道如何处理诸如
之类的命令SHELL$: sort < txtFile | grep key
我解析了命令行,以便我排序&lt; txtFile在一个char *数组中,而grep键在另一个char *数组
中任何帮助将不胜感激。
这是我到目前为止的代码:
PS:我没有包含处理重定向的代码
pid = fork();
if(pid == 0)
{
/* child process */
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)
{
/* parent process */
if(!async)
waitpid(pid, NULL, 0);
else
printf("this is an async call\n");
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);
}
这是我的主要内容:
int main (int argc, char* argv [])
{
char commands[BUFSIZ];
for(;;)
{
printf("MYSHELL$ ");
if(fgets(commands, BUFSIZ, stdin) == NULL)
{
perror("fgets failed");
exit(1);
}
execute(commands) ;
}
return 0;
}
所以在调用上面的命令之后,我的shell循环终止了。 我怎么能解决这个问题?
答案 0 :(得分:3)
看起来你的问题是你在管道中也是父进程中的exec()。 exec()用新的进程替换当前进程,所以当你在父进程中调用它时,你的shell被替换,所以循环甚至不再存在。
对于shell中的每个exec(),首先应该fork(),以确保父shell进程保持活动状态。