3

对于我的学校项目,我正在实施一个外壳,我需要工作控制方面的帮助。如果我们输入一个命令,比如cat &,那么因为&它应该在后台运行,但它不起作用。我有这个代码:

{
  int pid;  
  int status;  
  pid = fork();  
  if (pid == 0) {  
    fprintf(stderr, "Child Job pid = %d\n", getpid());  
    execvp(arg1, arg2);  
  } 
  pid=getpid();  
  fprintf(stderr, "Child Job pid is = %d\n", getpid());      
  waitpid(pid, &status, 0);  
}
4

2 回答 2

3

您应该为 SIGCHLD 信号设置一个信号处理程序,而不是直接等待。每当子进程停止或终止时都会发送 SIGCHLD。查看进程完成的 GNU 描述。

本文末尾有一个示例处理程序(我在下面或多或少地复制并粘贴了它)。试着用它来建模你的代码。

 void sigchld_handler (int signum) {
     int pid, status, serrno;
     serrno = errno;
     while (1) {
         pid = waitpid(WAIT_ANY, &status, WNOHANG);
         if (pid < 0) {
             perror("waitpid");
             break;
         }
         if (pid == 0)
           break;
         /* customize here.
            notice_termination is in this case some function you would provide
            that would report back to your shell.
         */             
         notice_termination (pid, status);
     }
     errno = serrno;
 }

关于这个主题的另一个很好的信息来源是UNIX 环境中的高级编程,第 8 章和第 10 章。

于 2012-11-11T04:53:00.540 回答
1

父进程正在调用waitpid子进程,子进程将阻塞直到子进程改变状态(即终止)。

于 2012-11-11T03:56:36.133 回答