关于fork那点事——比较有趣的问题

870阅读 0评论2013-07-25 梦醒潇湘love
分类:C/C++


    在自己学习或者浏览论坛的过程中,遇到一些与fork有关的小问题,有的比较清楚的解答,有的则不能,但是,这些问题确实可以帮助我更加深入的理解fork的使用,以及在使用过程中应该特别的注意哪些问题。
    下面是一些问题及相应的解答,都是来自网络,感谢各位的答案。

1、if((pid = fork()) < 0) 和if(pid = fork() < 0)有什么区别么?因为在Linux下着两个条件运行出的结果完全不同啊
    这个问题,我最近就遇到过,少了一个括号,结果却完全不同,百思不得其解啊,经过调试才发现问题。编程需要细心啊。
    解答如下:

    来自:

2、关于子进程的程序,假设每个函数调用都成功
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. int main(int argc, char **argv)
  5. {
  6.     fork( );
  7.     printf("How\n");
  8.     fork( );
  9.     printf("are\n");
  10.     fork( );
  11.     printf("you\n");
  12.     
  13.     return 0;
    此程序运行结束后,How、are、you各输出多少个?输出次序是否唯一?为什么?
    解答如下:
    按道理说,程序在运行时会分出其他的7个进程,一共8个进程。
    也就是说How最多运行两次,are最多运行4次,you最多运行8次。
    也不能确定执行的顺序。因为8个进程是相互独立的。
  
3、下面这个程序不难,只是我感觉网友的解释比较好
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <sys/wait.h>

  5. int main()
  6. {
  7.     pid_t p1, p2, p0;
  8.     p0 = getpid();
  9.     p1 = fork();
  10.     p2 = fork();
  11.     if(getpid() == p1)
  12.     {
  13.         printf("I am 1.\n");
  14.     }
  15.     if(getpid() == p2)
  16.     {
  17.         printf("I am 2.\n");
  18.     }
  19.     if(getpid() == p0)
  20.     {
  21.         sleep(3);
  22.         printf("I am 0.\n");
  23.     }
  24.     return 0;
  25. }
    运行结果只打印“I am 0.”。
    解释如下:
    函数fork()的返回值:子进程返回0,父进程中返回子进程的进程ID,出错返回-1。
    两次fork生成了四个进程,进程是从fork函数开始分叉的,而由于fork返回值不是自己的ID,所以只有爷爷进程里的p0才等于getpid。
    

    后续补充







    




上一篇:关于fork那点事——与vfork的区别
下一篇:变量的存储域