C - 完成后台进程时通知

时间:2018-04-22 07:49:44

标签: 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 ( 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的其他地方,请道歉,我尽可能彻底地搜索。

0 个答案:

没有答案