文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>《基于linux的C编程与内核导读》连载(9)

《基于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值。

相关阅读 更多 +
排行榜 更多 +
终极街头格斗

终极街头格斗

休闲益智 下载
大炮轰飞机

大炮轰飞机

飞行射击 下载
像素打僵尸

像素打僵尸

飞行射击 下载