用C创建进程的函数

时间:2013-11-13 15:06:32

标签: c shell fork pipe

我试图用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循环终止了。 我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:3)

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

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