系统编程__2__父子进程的创建和回收

系统编程

这里写的是对于小白来说更多的了解系统编程的文章,有写的不对的地方还恳请各位大佬指出错误,小编一定会多多采纳[手动多谢]。
那么,上一次我们稍微了解了一下关于系统编程的一些主要内容[没有看到的童鞋还请去上一篇文章稍微复习一下噢]。
这节课,我们先来想一想,我们为什么要学系统编程呢?原因很简单,我们要充分的利用CPU的性能,CPU和我们人类不太一样,我们人类大多数情况下,在同一时间,只能完成一件事,而CPU作为无数科学家的心血当然不会这么简单,CPU能够同时进行多个进程,这里的进程我们可以理解成任务,再说的生动形象一点,就是CPU可以在做饭的时候同时可以洗衣服,那么这是怎么完成这一系列的操作呢,咳咳,这里我们不进入深入了解,毕竟我们也是站在无数巨人的肩膀上进行开发的嘛,我们需要知道的是,怎么调用接口函数,使得CPU可以同时进行多个任务。

介绍一下关于父子进程和进程的ID号(注意父子进程只是进程间的其中一种关系):有血缘关系的进程(这里知道有这个概念就好,不必过于深究)
父进程:我们调用fork这个函数,创建出来的是子进程,调用fork的进程就是父进程。
子进程:fork产生的进程。
ID号:每个进程系统都会分配一个ID号,用来区分不同进程。

重点来了,父子进程的接口函数:

进程的创建:pid_t fork (void)
			返回值共有三种情况:>0 ;父进程的返回值,此时返回值为创建成功的那个子进程的ID号。
			=0;子进程的返回值
			<0;   创建进程失败
			注意:1.fork函数与以往我们使用的函数不一样,fork函数一次调用两次返回,即父,子进程各有一次返回值。
						2.fork函数调用之后父进程与子进程的操作是独立的,原因是因为当调用fork函数之后,系统会向
						内存生请一段和源码相同大小的内存空间,并将源码完整的复制过去(相似度为99。9%),这段内存用来
						运行fork产生的子进程,比如设置全局变量int a,在父进程中有a=4 ,子进程中a=3,则这段代码中
						a同时有两个值,父进程中有a=4 ,子进程中a=3 
						。

和文件IO类似,进程有着回收的步骤(这里只讲父子进程)。
在介绍进程回收之前,我们还得了解了解cpu的调度策略:

首先,我们了解了解什么是孤儿进程:

孤儿进程:又称僵尸进程,对于父子进程来说产生孤儿进程的原因是,父进程先于子进程退出,导致子进程无人回收,子进程就
变成了孤儿进程(重点)
进程的组成:数据段,代码段,进程控制块(PCB->process control block)
进程控制块:指的是系统中定义的一块结构体,该结构体用于储存进程运行时候的状态信息。(这里的概念了解了解就行)

我们再了解了解,孤儿进程有什么坏处:

坏处1:孤儿进程无法回收,占用cup内存.
坏处2:孤儿进程无法普通方法无法终止,可能造成像病毒一样的视觉效果。

进程的退出:

退出进程: void exit  (int status);
					void _exit (int status);

进程的回收:

进程回收:包含的头文件:#include
					pid_t wait (int * wstatus)
					返回值:成功, 返回回收的那个子进程的ID号
						   失败: -1 ;
						   参数:wstatus -->用于保存进程退出时,状态信息(包括退出值)exit退出的仅仅是一部分。
						   
					pid_t waitpid (pid_t pid ,int * wstatus,int options);
					返回值:成功返回回收的子进程的ID号
					失败:-1 ;
				    参数:pid  -->waitpid (-10002);//我要回收 进程组ID为10002里的某个子进程.
				    waitpid (-1);//我要回收任意一个子进程
				    waitpid (0);//我要回收任意一个子进程
				    waitpid (20000)//我要回收ID号为20000的进程
				    options->WNOHANG //非阻塞等待(父进程退出时,若子进程还没结束,那么父进程不阻塞等待,直接结束)。
				    	   ->阻塞等待

在很多时候我们都需要知道各个进程的ID号,比如,当想要回收某个确定的进程时,所以由此引出获取各个进程的ID号的函数,例:

		pid_t getpid (void)
		返回值:当前进程ID号
		
		pid_t getppid(void)
		返回值:当前父进程ID号
		
		pid_t getgrp(void)
		返回值:当前进程所属进程组ID号

下面介绍一下各种关于进程退出时可以利用进程退出值进行判断的宏定义(不用背,要用的时侯找出来用就行)

WIFEXITED(status)//如果子进程正常退出,则该宏为真。
WEXITSTATUS(status)//如果子进程正常退出,则该宏将获取子进程退出值。	
WCOREDUMP(status)//如果子进程被信号杀死且生成核心转储文件(core,dump),则该宏为真。
WTERMSIG (status)//如果子进程被信号杀死,该宏获取导致他死亡信号值
WIFSTOPPED(status)//如果子进程被信号暂停,且option中			WUNTRACED已被设置,为真。
WSTOPSIG(status)//如果WIFSYOPPEN(status)为真,则该宏将获取导致子进程暂停的信号值。
WIFCONTINUED(status),如果子进程被信号SIGONT重新置为就绪态,该宏为真。

你可能感兴趣的:(系统编程,linux,嵌入式,多线程)