博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Linux C 子进程的调度

Posted on 2012-03-21 16:32  bug yang  阅读(744)  评论(0编辑  收藏  举报

例子一:

#include<stdio.h>

  #include <sys/types.h> //pid_t类型定义

  #include <unistd.h> //函数fork(),getpid()定义

  void main ()

  {

  pid_t pid;

  pid=fork();

  if (pid < 0)

  printf("error in fork!");

  else if (pid == 0)

  printf("i am the child process, my process id is %d\n",getpid());

  else

  printf("i am the parent process, my process id is %d\n",getpid());

  }

例子二:

#include<stdio.h>

  #include <sys/types.h> //pid_t类型定义

  #include <unistd.h> //函数fork(),getpid()定义

  void main ()

  {

  pid_t pid,pid2;

  pid=fork();

  if (pid < 0)

  printf("error in fork!");

  else if (pid == 0)

  printf("i am the child process, my process id is %d\n",getpid());

  else

  printf("i am the parent process, my process id is %d\n",getpid());

  pid2=fork();

  if (pid2 < 0)

  printf("error in fork!");

  else if (pid2 == 0)

  printf("i am the child process, my process id is %d\n",getpid());

  else

  printf("i am the parent process, my process id is %d\n",getpid());

  }


输出:

I am the paraent process,my process is 2927
I am the paraent process,my process is 2927
I am the child process, my process id is 2928
I am the paraent process,my process is 2928
I am the child process, my process id is 2929
I am the child process, my process id is 2930

运行过程:

首先是“父进程27”开始执行,执行到pid,生成子进程pid,然后输出一次“27”,执行到pid2,生成子进程pid2,然后输出一次“27”;

然后开始从第一个fork()执行pid子进程,输出“子进程28”,然后执行到第二个fork(),生成子进程pid2,输出“父进程28”(即pid作为的父进程)。

然后开始从第二个fork()执行pid子进程的子进程,输出“子进程29”

然后开始从第二个fork()执行pid2子进程,输出“子进程30”

 

看这个程序的时候,头脑中必须首先了解一个概念:在语句pid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的代码部分完全相同,将要执行的下一条语句都是if(pid==0)……。

 

两个进程中,原先就存在的那个被称作“父进程”,新出现的那个被称作“子进程”。父子进程的区别除了进程标志符(process ID)不同外,变量pid的值也不相同,pid存放的是fork的返回值。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:

  1. 在父进程中,fork返回新创建子进程的进程ID;
  2. 在子进程中,fork返回0;
  3. 如果出现错误,fork返回一个负值;