0

我正在尝试使用 C 实现 shell。我目前正在尝试处理程序的管道,但还没有运气。我想知道如何处理诸如

SHELL$: sort < txtFile | grep key

我解析了命令行,以便我在一个 char* 数组中有 sort < txtFile,在另一个 char* 数组中有 grep 键

任何帮助将不胜感激。

这是我到目前为止的代码:

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 循环终止。我该如何解决这个问题?

4

1 回答 1

3

看起来你的问题是你在管道时也在父进程中 exec() 。exec() 将当前进程替换为新进程,因此当您在父进程中调用它时,您的 shell 将被替换,因此循环甚至不再存在。

对于 shell 中的每个 exec(),您应该首先 fork(),以确保父 shell 进程保持活动状态。

于 2013-11-13T15:15:08.957 回答