【问题标题】:C: How to print parent process at the end of child?C:如何在子进程结束时打印父进程?
【发布时间】:2017-09-27 23:25:26
【问题描述】:

如何修改这段代码,让父进程打印出它的信息,毕竟子进程执行完了。

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>

    int main (int argc, char *argv[]) {
       pid_t childpid = 0; 
       int i, n;

       if (argc != 2){   /* check for valid number of command-line arguments */ 
          fprintf(stderr, "Usage: %s processes\n", argv[0]);
          return 1; 
       }     
       n = atoi(argv[1]);  
       for (i = 1; i < n; i++)
          if ((childpid = fork()) <= 0)
             break;

       fprintf(stderr, "i:%d  process ID:%ld  parent ID:%ld  child ID:%ld\n",
               i, (long)getpid(), (long)getppid(), (long)childpid);
       return 0; 
    }

【问题讨论】:

  • 使用waitwaitpid 系统调用。

标签: c multithreading process-management


【解决方案1】:

要将父进程与子进程同步,您希望使用waitwaitpid

https://linux.die.net/man/3/wait

从简单的开始,您可以在一个循环中调用wait,该循环将迭代与您希望等待的孩子数量一样多的次数。在你完成所有孩子的产卵之后,也许类似的事情可以让你开始:

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>

int main (int argc, char *argv[]) {
   pid_t childpid = 0; 
   int i, n;

   if (argc != 2){   /* check for valid number of command-line arguments */ 
      fprintf(stderr, "Usage: %s processes\n", argv[0]);
      return 1; 
   }     
   n = atoi(argv[1]);  
   for (i = 1; i < n; i++)
         if ((childpid = fork()) <= 0)
            break;

   if (childpid>0){ // parent process
       while (i>1) {
           wait(NULL);
           i--;
       }
   }

   fprintf(stderr, "i:%d  process ID:%ld  parent ID:%ld  child ID:%ld\n",
           i, (long)getpid(), (long)getppid(), (long)childpid);
   return 0;
}

【讨论】:

  • 我已经读过这个但无法理解..你能帮我写代码吗?
  • 我添加了一个小代码示例,我认为至少应该在基本级别上工作。
  • 你可以用我在问题中提到的例子来展示,我正在学习这个,在代码中展示会有所帮助
  • 该代码旨在在您突破for-loop 之后和fprintf 之前插入到您自己的代码示例中
  • 我不明白 :(
猜你喜欢
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
相关资源
最近更新 更多