LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: colored

[c]关于fork()前后进程的运行

[复制链接]
发表于 2003-6-10 19:59:23 | 显示全部楼层
说到子孙进程.我就有点不理解了.
比如说:我想创建二个子进程.这五个子进程是平等的.
如果我用下面的代码的话:

  1. pid1=fork();//第一个子进程
  2. pid2=fork();//这是第二个子进程还是第一个子进程的子进程,还是两种都会创建?
  3. 或者可以这样得到:
  4. pid1=fork();
  5. if(pid1==0)
  6. pid2=fork();
复制代码
发表于 2003-6-10 20:49:03 | 显示全部楼层
pid1=fork();
pid2=fork();
1和2都是本进程的子进程
pid1=fork();
if(pid1==0)
pid2=fork();
1是子进程,2是1的子进程,是本进程的子子进程

建议写段代码做个实验,用ps f看一下,当然,不能让进程直接结束了,呵呵。
 楼主| 发表于 2003-6-10 21:29:12 | 显示全部楼层

我想应该这样

pid1=fork();
pid2=fork();//父进程与子进程都执行这一句,所以产生一个子进程和一个子子进程

pid1=fork();
if(pid1==0)
pid2=fork();
//这样pid2只在子进程中产生,为子子进程
 楼主| 发表于 2003-6-10 21:33:49 | 显示全部楼层

如果要产生多个平行子进程

  1. pid1=fork();
  2. if(pid1>0)
  3. {
  4.   pid2=fork();
  5.   if(pid2>0)
  6.   {
  7.     pid3=fork()
  8.     if(..)
  9.     {......}
  10.   }
  11. }
复制代码
发表于 2003-6-10 21:42:03 | 显示全部楼层
同意colored,我的说的不对。
发表于 2003-6-11 08:14:02 | 显示全部楼层
pid1=fork();//第一个子进程
pid2=fork();//这是第二个子进程还是第一个子进程的子进程,还是两种都会创建?

如果这样写,相当于

  1. pid1=fork();
  2. switch(pid1) {
  3.      case 0:   pid2=fork();break;
  4.      case -1:  break;
  5.      default:    pid3=fork();
  6. }
复制代码

也就是第一次fork()之后的两个子进程,再各自产生一个孙子进程。
发表于 2003-6-12 22:48:15 | 显示全部楼层
我的老师要我做一个哲学家的进餐同步程序,有五个哲学家,也就是有五个子进程,如果用你的办法,那不是要用到很多个for循环?如果要创建更多的进程,那不是要用到更多吗?难道没有其它的办法吗?
发表于 2003-6-13 02:47:45 | 显示全部楼层

  1. #define NUMBER 5
  2. ……
  3. int i;
  4. pid_t pid[NUMBER];
  5. for(i = 0; i < NUMBER; i++){
  6.   if((pid[i] = fork()) < 0)
  7.     perror("fork() failed");
  8.   else if(pid[i] == 0){
  9.     …… /* 子进程 */
  10.   }
  11. }
复制代码
发表于 2003-6-13 10:53:41 | 显示全部楼层
pid=0时是子进程,pid>0时是父进程,没错啊
发表于 2003-6-13 12:32:00 | 显示全部楼层
如果这样说,那五个子进程返回父进程的pid都不等于零,而五个子进程的 pid都等于零,那我还怎么判断这五个子进程啊?可不可以是:

  1. #define NUMBER 5
  2. ……
  3. int i;
  4. pid_t pid[NUMBER];
  5. for(i = 0; i < NUMBER; i++){
  6.   if((pid[i] = fork()) < 0)
  7.     perror("fork() failed");
  8.   else if(pid[i] == 0){
  9.     …… /* 子进程 */   这是的子进程要如果区别?
  10.   }
  11. }
复制代码

比如我要创建两个并行进程,一个打印第一子进程,一个 打印第二子进程。能不能这样:

  1. pid_t pid;
  2. for(i=0;i<2;i++)
  3. if((pid[i]=fork())<0)
  4. perror("fork error!");
  5. else
  6. if(pid[i]==0)
  7. swich(i) {
  8. case 0: printf("This is the first child procedure");
  9. case 1: printf("This is the second child procedure");
  10. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表