这几天看了一下,进程控制和线程控制还有信号以及信号处理,写的很好,但是有的还是很难理解,下面写写如何创建子进程。
我们先来看看进程是什么,进程是一个动态的实体,是程序的一次执行过程,说通俗点,就是运行一个程序的时候,就创建了一个这个程序的进程。
但是有时候,不是一个程序就能解决问题,所以我们必须得创建子进程,去做其他事情,让主进程管理着下面的各种子进程。所以今天来写写创建进程的的代码,
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 内核版本控制的。所以你在做这个例子的时候,显示结果顺序不一样,请不要感到奇怪。
这个藐视是C
没错,就是C语言的编程。只不过我是再linux下完成的。感谢你的关注。
你厉害,今后打算做编程吗?为什么不搞搞java?
想往linux方向,java跨平台,但是对效率上,不会太高,而且C语言是基础,学好了,学其他的也都快。
羡慕会编程滴
会编程,不过现在也找不到出路呢
文章不错,博客也不错
嗯,谢谢,只是用心去简单的记录一下
文章好长
一看就是牛人
一般一般,正在学习中。
徒儿请受师傅一拜~O(∩_∩)O哈哈~
一般一般,今天刚把twitter的api搭建好了,真爽。
不敢不敢,还没能力做师傅呢,一起学习吧。呵呵