Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2097173
  • 博文数量: 249
  • 博客积分: 1305
  • 博客等级: 军士长
  • 技术积分: 4733
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-17 10:37
个人简介

不懂的东西还有很多,随着不断的学习,不懂的东西更多,无法消灭更多不懂的东西,那就不断的充实自己吧。 欢迎关注微信公众号:菜鸟的机器学习

文章分类

全部博文(249)

文章存档

2015年(1)

2014年(4)

2013年(208)

2012年(35)

2011年(1)

分类: C/C++

2013-07-25 10:03:36


    在自己学习或者浏览论坛的过程中,遇到一些与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。
    

    后续补充







    




阅读(784) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~