C-后台进程完成时通知

C-后台进程完成时通知,c,process,posix,wait,C,Process,Posix,Wait,我正在创建一个小型shell程序,shell的一个功能是能够在后台运行命令 如果作业在后台运行,则会显示一条小消息,通知用户pid 此外,我还希望能够在后台工作完成时通知用户 这是我目前的代码: int execArgs(char *argv[], int bg) { int pid ; int child_info = -1; if(argv[1] == "exit"){ printf("%s\n", argv[0]); } if ( arg

我正在创建一个小型shell程序,shell的一个功能是能够在后台运行命令

如果作业在后台运行,则会显示一条小消息,通知用户pid

此外,我还希望能够在后台工作完成时通知用户

这是我目前的代码:

int execArgs(char *argv[], int bg)
{
  int   pid ;
  int   child_info = -1;

  if(argv[1] == "exit"){
    printf("%s\n", argv[0]);    
    }

  if ( argv[0] == NULL )        /* nothing succeeds */
    return 0;

  if ( (pid = fork())  == -1 )
    perror("fork");
  else if ( pid == 0 ){
    signal(SIGINT, SIG_DFL);
    signal(SIGQUIT, SIG_DFL);
    execvp(argv[0], argv);
    perror("cannot execute command");
    exit(1);
  }
  else {

        if(bg == 0){
            if ( wait(&child_info) == -1 )
        perror("wait");
        }
        else
            printf("The Process PID:%d has started\n", pid);

  }
  return child_info;
}
我知道答案就在于这件事

pid_t return_pid = waitpid(process_id, &status, WNOHANG);
但我不明白如何完全使用它,“状态”是什么意思

我试着这样实现它:

int execArgs(char *argv[], int bg)

{
  int   pid ;
  int   child_info = -1;

  if(argv[1] == "exit"){
    printf("%s\n", argv[0]);    
    }

  if ( argv[0] == NULL )        /* nothing succeeds */
    return 0;

  if ( (pid = fork())  == -1 )
    perror("fork");
  else if ( pid == 0 ){
    signal(SIGINT, SIG_DFL);
    signal(SIGQUIT, SIG_DFL);
    execvp(argv[0], argv);
    perror("cannot execute command");
    exit(1);
  }
  else {

        if(bg == 0){
            if ( wait(&child_info) == -1 )
        perror("wait");
        }
        else
            printf("The Process PID:%d has started\n", pid);
            int status;
            pid_t return_pid = waitpid(pid, &status, WNOHANG); /* WNOHANG def'd in wait.h */
            if (return_pid == -1) {
                /* error */
            } else if (return_pid == 0) {
                /* child is still running */
            } else if (return_pid == pid) {
                printf("The process PID:%d has finished\n", pid);
            }

  }
  return child_info;
}
但它不起作用。我读过手册页,但是有点麻烦,我不理解


抱歉如果答案在StackOverFlow的其他地方,我会尽可能彻底地搜索。

当子进程退出时,父进程将收到一个SIGCHLD。没有阅读所有的代码,我怀疑这可能就是你在寻找的。如果你真的不做任何事情,只是等待孩子完成,你不需要信号,只需要删除WNOHANG,所以
waitpid()
阻塞直到孩子退出。
argv[1]=“退出”
是错误的。使用strcmp