Linux编程:创建子进程

这几天看了一下,进程控制和线程控制还有信号以及信号处理,写的很好,但是有的还是很难理解,下面写写如何创建子进程。

我们先来看看进程是什么,进程是一个动态的实体,是程序的一次执行过程,说通俗点,就是运行一个程序的时候,就创建了一个这个程序的进程。

但是有时候,不是一个程序就能解决问题,所以我们必须得创建子进程,去做其他事情,让主进程管理着下面的各种子进程。所以今天来写写创建进程的的代码,

Linux下,创建子进程的函数是 fork 函数,使用以下命令获得该函数的声明:

man 2 fork
#include <sys/types.h>
#include <unistd.h>
pid_t fork <void>

一般情况下,函数最多又一个返回之,但 fork 函数非常特殊,他有两个返回值,即调用一次,返回两次。成功调用 fork 函数后,当前进程实际已经分裂为两个进程,一个是原来的进程,称为父进程,另一个是刚刚创建的子进程。父子进程再调用 fork 函数的地方分开,fork 函数返回两个值,一个返回给父进程,返回值是刚刚创建的子进程的 ID,另一个返回给子进程,返回值是 0。

下面看看创建子进程的例子。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
	pid_t  pid;
	printf("Process Creation Studyn");
	pid = fork();
	switch(pid) {
		case 0:
			printf("Child process is running,CurPid is %d, ParentPid is %dn", pid, getppid());
			break;
		case -1:
			perror("Process creation failedn");
			break;
		default:
			printf("Parent process is running,ChildPid is %d, ParentPid is %dn", pid, getpid());
			break;
	}
	exit(0);
}

程序运行一次的结果显示如下。

Process Creation Study
Parent process is running,ChildPid is 3612, ParentPid is 3611
Child process is running,CurPid is 0, ParentPid is 3611

从运行结果看出,进程创建成功后,fork 函数返回了两次,一次返回值是 0,代表子进程在运行,通过函数getppid 得到其父进程 ID 为 3611,另外一次返回值为 3612,即子进程 ID,代表当前父进程在运行,通过函数getpid得到父进程 ID 为3611,刚好与前面得到的父进程 ID 一致,

我们可以看到结果是显示父进程信息运行在先,这是为什么,因为使用 fork 函数之后,进程分裂为父子进程后,是父进程先运行才到子进程运行。书本上说应该是子进程先于父进程进行,我研究以下,应该是内核控制算法出现的不同差异,因为书本教程是已 Red Hat 为蓝本做的教程,而我所做的程序例子是运行再 ubuntu 的linux系统下,也就是说,父子进程谁先运行并不是固定的,而是由发行版的 linux 内核版本控制的。所以你在做这个例子的时候,显示结果顺序不一样,请不要感到奇怪。

{ 发表评论? }

  1. BoKeam

    这个藐视是C

  2. 卢松松

    你厉害,今后打算做编程吗?为什么不搞搞java?

  3. 三叶草

    羡慕会编程滴

  4. 快播

    文章不错,博客也不错

  5. 灵亦rEd

    文章好长
    一看就是牛人

      • 灵亦rEd

        徒儿请受师傅一拜~O(∩_∩)O哈哈~

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>