LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4381|回复: 52

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

[复制链接]
发表于 2003-6-8 11:08:22 | 显示全部楼层 |阅读模式
  1. #include <sys/wait.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. int main()
  5. {
  6.         pid_t pid;
  7.        
  8.         if((pid=fork())<0)
  9.                 printf("fork failde!");
  10.         printf("pid=%d before getpid() in parent\n",pid);//[color=red]这一段为什么运行了两遍[/color]
  11.         if(pid==0)
  12.         {
  13.                 printf("pid=%d before getpid() in child\n",pid);
  14.                 pid=getpid();
  15.                 printf("pid=%d after getpid() in child\n",pid);
  16.         }
  17.         else
  18.         {
  19.                 printf("pid=%d before wait() in parent\n",pid);
  20.                 pid=wait((int *) 0);
  21.                 printf("pid=%d after wait() in parent\n",pid);
  22.         }
  23. }
复制代码
运行结果:
pid=857 before getpid() in parent第一遍
pid=857 before wait() in parent
pid=0 before getpid() in parent第二遍
pid=0 before getpid() in child
pid=857 after getpid() in child
pid=857 after wait() in parent
 楼主| 发表于 2003-6-8 11:13:19 | 显示全部楼层

为什么两次pid的值不同

发表于 2003-6-8 11:30:13 | 显示全部楼层
一次是父进程,一次是子进程。
 楼主| 发表于 2003-6-8 12:51:21 | 显示全部楼层

pid=857是父进程的ID?

发表于 2003-6-8 13:31:31 | 显示全部楼层
pid是fork得到的,是子进程的id,在子进程里pid是0
发表于 2003-6-8 15:05:01 | 显示全部楼层
菜鸟也来说一说.前几天刚被版主们打回原形.
乖乖地去看书了.
printf("pid=%d before getpid() in parent\n",pid);//这一段为什么运行了两遍
因为fork()后,子进程从被父进程唤醒的位置上继续它的执行.所以会执行两次.如果把这一句放在fork()前,就不会执行两次了.
我自己也有一个不明白的程序:

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. main()
  4. {
  5. int i;
  6. static char buffer[10];
  7. if(fork()==0)
  8.         {
  9.         strcpy(buffer,"Child\n");
  10.         }
  11. else
  12.         {
  13.         strcpy(buffer,"Parent\n");
  14.         }
  15. for(i=0;i<5;i++)
  16.         {
  17.         sleep(1);
  18.         printf("%s",buffer);
  19.         }
  20. }
复制代码

运行的结果是Parent,Child交叉地显示.而且每显示一个都会显示回车.但我没有在printf中加入回车.
而且printf是先放在缓冲里,然后再显示.为什么不是五个Parent,五个Child一起显示出来呢?
发表于 2003-6-8 16:03:39 | 显示全部楼层
strcpy向buffer里拷字符串不是有\n吗,所以printf里就不用\n了。
显示问题,因为你有sleep(1),
实际上这和系统的进程调度有关,和你运行程序时的环境有关,显示顺序不一定的。
发表于 2003-6-8 16:31:05 | 显示全部楼层
....没有看到自己已经写了个\n.
虽然不一定,但由于是停1S再运行,所以还是有可能交叉的.
我现在不明白的是:
printf和write有什么区别?是不是只是有无写到缓冲的区别呢?
printf不会只是调用了write这么简单吧?
 楼主| 发表于 2003-6-8 18:39:23 | 显示全部楼层

在本段代码中

getpid()倒底得到的是父进程的id还是子进程的id
发表于 2003-6-8 19:43:39 | 显示全部楼层
getpid()得到的是当前进程的id。
进程从fork()处开始分成两个进程来执行。所有fork()之后的语句都要被父子进程各执行一遍。所以打印两次就一点不奇怪了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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