Linux进程的概念 和fork函数的概念与使用

本文介绍了进程的概念,包括单道和多道程序设计,以及并发和进程的关系。重点讨论了fork函数在创建子进程中的作用,父子进程的区分以及进程控制原语如exit和wait。还提到了孤儿和僵尸进程的问题,以及如何处理僵尸进程,强调了进程资源的回收机制和wait、waitpid函数的作用。
摘要由CSDN通过智能技术生成

进程

单道程序设计

多道程序设计

并发:对CPU的分时复用

进程:进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构种,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器,程序是指令,数据及其组织形式的描述,进程是程序的实体。

白话文:程序编译完得到可执行程序,可执行程序在计算机中执行,就生成了进程

fork

函数原型:pid_t fork(void)

功能: 创建一个子进程

返回值:

成功:在父进程中返回子进程的进程ID,在子进程中返回0

失败:父进程中返回-1,没有子进程生成

在程序运行中,如何区分父子进程

利用父子进程fork函数的返回值不同区分

如何创建多个子进程(最后不要这样写)

这样回导致子进程也参与创建子进程,可以这么写

父子进程之间 不共享堆区 栈区 数据区

父子进程之间的关系:Linux下除了0号进程以外,所有的进程都是由其父进程创建的,默认情况下,子进程的所有属性,代码,数据等都是拷贝于他的父进程

进程的控制原语

fork

创建子进程

exit

函数原型:voidexit(int status);

功能:结束调用这个函数的进程

进程的结束:

正常结束:调用了exit,_exit或者在主函数中return。

异常结束:在Linux下是因为收到了某个信号

正常结束:进程是有返回值

异常结束:在系统中会保存杀死进程的信号

return:返回到函数的调用者

注意:在主函数中return,相当于调用exit

getpid

功能:获取当前进程的进程ID

getppid

功能:获取当前进程父进程的ID

以下程序 “hello world”会被打印多少次

解析:

以下程序 “hello world”会被打印多少次

解析:

问题:进程回收,必须由父进程回收子进程,如果说一个父进程创建了一个子进程,父进程先于子进程结束了,会怎样?(子进程死亡的时候还需要被回收么? 需要的话会被谁回收?)

孤儿进程:父进程已经结束,子进程尚未终止,这个时候子进程就成为了孤儿进程,孤儿进程只是一个非常短暂的状态,孤儿进程会成为init进程的子进程,init进程会成为孤儿进程的新的父进程,之后孤儿进程的回收和释放就有init进程完成,init进程是1号进程

僵尸进程

僵尸进程:子进程已经结束,父进程尚未对子进程进行回收,这时子进程处于僵尸态

僵尸进程会占用系统资源,怎样处理僵尸进程:

预防:父进程需要回子进程

处理:Kill僵尸进程是没用的,可以kill僵尸进程的父进程,让僵尸进程成为init进程的子进程,由init进程进行回收释放。

进程回收:

进程在结束的时候:

正常结束:会在系统内存中留有一小部分数据--进程的返回值

异常结束:会在系统内存中留有一小部分数据--小部分数据--进程的死亡信息--信息编号

进程死亡时遗留在系统内存中的这些信息就可以通过进程回收获取到

pid_t wait(int *wstatus);

进程回收:一次wait只能回收掉一个子进程

参数:wstatus:用于存储从内存中回收掉的数据

返回值:成功回收掉的子进程的进程ID

wstatus需要借助一些宏函数进行分析

WEXITED(intwstatus);

说明:用于判断回收掉的子进程是否是正常结束的,如果进程是正常结束的WEXITED返回true

WEXITSTATUS(int wstatus);

说明:只有当WEXITED返回值为true才可以使用,功能是获取一个正常结束的进程的返回值

WSIGNALED(int wstatus);

说明:用于判断回收掉的子进程是否是异常结束的,如果进程是异常结束的WSIGNALED返回true

WTERMSIG(int wstatus);

说明:只有当WSIGNALED返回值为true才可以使用,功能是获取导致进程结束的信息编号

问题:父进程必须在子进程结束之后调用wait回收子进程么?

当父进程调用wait回收子进程时,发现,当前父进程没有子进程死亡,当时有子进程存在,父进程会阻塞在wait上,一旦子进程结束,父进程马上对其进行回收;如果当时没有子进程存在,wait会马上返回-1,并设置errno.

wait以阻塞方式回收子进程,并且只能以阻塞方式回收子进程

waitpid

函数原型:pid_t waitpid(pid_t pid,int*wstatus,int options);

参数:

pid:

wstatus:

options:WNOHANG使用非阻塞形式回收子进程

非阻塞回收子进程:

当父进程调用wait回收子进程时:

有子进程已经结束了,wait回收掉一个已经结束的子进程然后返回被成功回收掉的子进程ID

当前父进程没有子进程死亡,当时有子进程存在,父进程waitpid会马上返回0

如果当时没有子进程存在,wait会马上返回-1,并设置errno

雨下整夜我的爱溢出就像雨水

院子落叶跟我的思念厚厚雪

几句是非他无法将我的热情冷却

你出现在我诗的每页

整夜我的爱溢出就像雨水

窗台蝴蝶像诗里纷飞的美丽章节

我接着写

把永远爱你写进诗的结尾

你是我唯想要的了解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值