在退出之前打印进程的退出状态

时间:2016-09-26 18:21:49

标签: c shell exit

void execute(char **argv,int num)
{
    int i;
    pid_t  pid;
    int    status;
    int child_status;

    if ((pid = fork()) < 0) 
    {     /* fork a child process*/
        printf("*** ERROR: forking child process failed\n");
        exit(1);
    }
    else if (pid == 0) 
    {          /* for the child process: */
        int c;
        if (c==execvp(argv[0], argv) < 0) 
        {     /* execute the command  */
            printf("%d\n", c);
            printf("*** ERROR: exec failed\n");
            perror(" ");
            exit(1);
        }
    }
    else if(bg!=1){
        while (waitpid(pid,&status,WNOHANG|WUNTRACED));
    }
    else if(bg==1)
    {
        wait (&child_status);
        if (WIFEXITED (child_status))
        {
            printf("the child process exited normally, with exit code %d\n",
                    WEXITSTATUS (child_status));
        }
        else
            printf ("the child process exited abnormally\n");
    }
}

这是我的自定义shell中的执行函数。当我执行gedit &之类的操作时,将在打印下一个提示之前打印退出状态。我该如何解决? 我做错了什么?

1 个答案:

答案 0 :(得分:0)

无论变量bg设置为什么,execute()都会阻塞等待函数完成。换句话说,无论您是否想在后台运行流程,都会获得相同的行为。

一些建议:

  • 当你想在后台运行一个进程时,不要在execute()中调用waitpid()或wait(),而只是返回PID。调用者将负责检测进程何时终止。
  • 如果execute()运行前台进程,则返回一个已知的非进程PID,如-1,以便调用者知道不将其添加到后台进程列表中。
  • 调用者应该在打印提示之前检查其后台进程列表 - 在前台进程完成或后台进程运行之后。确保通过非阻塞调用完成此操作。
  • 传入bg作为执行
  • 的参数