《基于linux的C编程与内核导读》连载(9)
时间:2009-07-23 来源:叮汀
Posted in 0 Comment(s)
3.3 C语言编程实例
3.3.1 子进程的创建
我们首先利用系统调用fork()函数来创建一个子进程,初步体会一下并发活动的计算机世界。
fork()函数的调用格式是:
int pid; pid = fork(); |
子进程被创建后就进入就绪队列和父进程分别独立地等待调度。子进程继承父进程的程序段代码,子进程被调度执行时,也会和父进程一样从fork()返回。从共享程序段代码的角度来看,父进程和子进程所执行的程序代码是同一个,在内存中只有一个程序段副本;但是从编程角度来看,为了使子进程和父进程做不同的事,要在程序中区分父进程和子进程的代码段,这就需要判断pid的值来确定当前进程的身份。
(1) 若pid小于0,则表示fork()出错。
(2) 若pid等于0,则表示当前进程是子进程,继续执行的后面的代码是子进程要做的事。
(3) 若pid大于0,则表示当前进程是父进程,继续执行的后面的代码是父进程要做的事。
程序3.1如下:
#include <sys/types.h> #include <stdio.h> #include <unistd.h>
int main(void) { int pid; pid=fork(); /*调用系统调用fork(),建立子进程*/ if(pid<0) /*创建子进程发生错误 */ { printf(“fork error!\n”); exit(1); } else if(pid==0) /*系统返回的是子进程,则下面为子进程的代码*/ { printf(“Child process is printing.\n”); printf(“The ID of child process is %d\n”,getpid()); printf(“The ID of parent process is %d\n”,getppid()); } else /*系统返回的是父进程,则下面为父进程的代码*/ { printf(“Parent process is printing.\n”); printf(“The pid is %d\n”,pid); } exit(0); } |
结果分析:
这是一个简单的派生进程的例子。因为子进程被创建后处于就绪态。此时,父进程和子进程作为两个独立的进程,共享同一个代码段,分别参加调度、执行、直至进程结束。但是谁会先被调度程序选中执行,则与系统的调度策略和系统当前的资源状态有关,是不确定的。因此,我们在这里仅列出一种可能的显示结果:
Child process is printing. The ID of child process is 2047 The ID of parent process is 2046 Parent process is printing. The pid is 2047 |
从上面的结果可以看出,子进程的ID号是在父进程基础上加1产生的。另外在父进程执行的代码段中,pid的值是其子进程的ID值。