【问题标题】:Parent/Child process print父/子进程打印
【发布时间】:2016-05-09 01:50:19
【问题描述】:

我正在编写一个创建子进程的 C 程序。创建子进程后,父进程应该输出两条消息:“我是父进程”,然后它应该打印“父进程完成”。子进程“我是孩子”和“孩子完成了”也是如此。但是我想确保,孩子的第二条消息总是在父母的第二条消息之前完成。我怎样才能实现打印“孩子完成”和“父母完成”而不是打印他们的pid?

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

main()
{
  int pid, stat_loc;


  printf("\nmy pid = %d\n", getpid());
  pid = fork();

  if (pid == -1)
    perror("error in fork");

  else if (pid ==0 )
    { 
       printf("\nI am the child process, my pid = %d\n\n", getpid());


    } 
  else  
    {
      printf("\nI am the parent process, my pid = %d\n\n", getpid());       
      sleep(2);
    }  
  printf("\nThe %d is done\n\n", getpid());
}

【问题讨论】:

    标签: c multithreading pthreads fork


    【解决方案1】:

    您可以在父级中设置一个标志变量,但随后子级将其清除。然后只需检查最后一个输出。

    类似

    int is_parent = 1;  // Important to create and initialize before the fork
    
    pid = fork();
    
    if (pid == -1) { ... }
    
    if (pid == 0)
    {
        printf("\nI am the child process, my pid = %d\n\n", getpid());
        in_parent = 0;  // We're not in the parent anymore
    }
    else { ... }
    
    printf("\nThe %s is done\n\n", is_parent ? "parent" : child");
    

    【讨论】:

    • 它按我的意愿工作。非常感谢flag变量的清晰解释。
    【解决方案2】:

    在父进程中调用wait(2)让子进程完成。

      else
        {
          wait(0);
          printf("\nI am the parent process, my pid = %d\n\n", getpid());
        }
    

    您应该检查wait() 是否成功并且main() 的返回类型应该是int

    【讨论】:

    • wait 接受一个指针。对于 空指针常量,您应该使用宏 NULL,而不是整数文字 0(尽管在技术上是正确的)。另外,wait(2) 是什么意思?这绝对是错误的。
    • @Olaf 使用0 绝对没有任何意义。见 C11,6.3.2.3。 wait(2) 指的是 wait() 是一个 Unix 系统调用。
    • 我非常有信心我的评论清楚地表明它在技术上是正确的;只是风格不好。关于电话:所以它是wait,而不是POSIX的wait(2). If you refer to the man-page, that would be 3`; 2 用于 Linux 手册页。 OP没有说明他使用Linux,所以最好参考标准。
    • @Olaf 说这种风格不好是我不同意的您的意见。 Unix 早在 POSIX 出现之前就已经存在,wait() 一直是一个系统调用。系统调用一直是2
    • @Olaf: ISO/IEC 9899:2011 §6.3.2.3 指针¶3“一个值为 0 的整数常量表达式,或这种类型转换为 void * 的表达式,称为 空指针常量。”当wait() 有一个有效的原型时,就不会有混淆的风险; 0 是一个完全有效的空指针常量。 (有一个脚注引用了我没有显示的 NULL 和 &lt;stddef.h&gt;。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多