进程的相关知识总结

前几篇博文中我已经介绍过进程的创建以及一些基本知识,这里就不再赘述,本篇博文我主要会涉及进程的终止细节以及父进程对子进程的监控,还有函数组exec()

1.进程的终止

(1)_exec()和exit()

进程终止分俩中情况,一种是收到某种信号异常终止,另一种是调用_exit()正常退出

#include<unistd.h>
void _exit(int status);

参数status保存了进程的终止状态,父进程可调用wait()获取该状态

#include<stdio.h>
void _exit(int status);

一般情况下进程并不会直接调用_exit()而是调用exit(),它会在调用_exit()之前执行如下操作

.调用退出处理程序,其执行顺序与注册顺序相反

.刷新stdio流缓冲区

.使用由status提供的值执行_exit()系统调用

程序的另一种终止方法是从main函数返回(return),其实其也是调用了exit()唯一的区别就是如果在退出的处理过程中所执行的任何函数想要访问main函数的本地变量,那么从main函数返回会导致未定1义的行为

(2)进程终止的细节

无论进程是否正常终止都会发生以下动作

.关闭所有打开的文件描述符,目录流。。。

.因为文件描述符被关闭,所以释放该进程所持有的一切文件锁

.若进程是管理终端的管理进程,则它会向该终端进程组中的所有进程发送SIGHUP信号

.将关闭进程打开的任何信号量

(3)退出处理程序

#include<stdlib.h>
int atexit(void(*func)(void));
//返回0成功,否则失败

函数atexit()将func()加到一个函数列表中,进程终止时会调用该函数列表中的所有函数,应将函数func定义成无返回值也不接受任何参数

2.监控子进程

(1).系统调用wait()

#include<sys/wait.h>
pid_t wait(int status);
//返回退出子进程的ID

该调用阻塞父进程等待子进程的终止,并在status指向的缓冲区中返回子进程的终止状态,wait()执行的具体操作如下:

.如果调用进程并无之前未被等待的子进程终止,调用将一直阻塞,直至某个子进程终止,如果调用时已有子进程终止,则立即返回

.如果status非空,那么关于子进程如何终止的信息则会通过status指向的整个变量返回

.内核将会为父进程下所有子进程的运行总量追加进程CPU时间以及资源使用数据

.将终止子进程的PID作为wait的返回结果

(2)系统调用waitpid()

#include<sys/wait.h>
pid_t waitpid(pid_t pid,int *status,int options);
//返回子进程ID

waitpid()比起wait()所突破的地方

.如果pid大于0,表示等待进程ID为pid的子进程

.如果pid等于0,则等待与调用进程同一个进程组的所有子进程

.如果pid小于-1,则会等待进程组标识符与pid绝对值相等的子进程

.如果pid等于-1,则等待任意子进程

参数options是一个位掩码,可以包含0个或多个如下标志

options 具体描述
WUNTRACED 返回终止子进程的信息,还返回因信号而停止的子进程信息
WCONTINUED 返回那些因收到SIGCONT(暂停重新开始)信号而恢复执行的已停止子进程的状态信息
WNOHANG 如果参数pid所指定的子进程并未发生状态改变,则立即返回,而不会阻塞

(3)wait3()和wait4()

#include<sys/resource.h>
#include<sys/wait.h>
pid_t wait3(int *status,int option,struct rusage *rusage);
pid_t wait4(pid_t pid,int *status,int options,struct rusage *rusage);

wait3与wait4与上述的根本区别是,他们通过rusage结构体返回子进程的资源使用情况

(4)孤儿进程与僵尸进程

孤儿进程:

当父进程先于子进程退出时,该子进程就变成了孤儿进程,该孤儿进程会被init收养

在父进程执行wait()之前,其子进程就已终止,那么系统会将子进程转化为僵尸进程,来使父进程获得其终止状态,僵尸进程把自己把持的大部分资源都释放掉,只保留了内核进程表中的一条记录,其中包含该进程ID,终止状态,资源使用数据等信息,当父进程执行wait()后,内核将删除该僵尸进程,如果父进程未执行wait()随即退出,则init会接管该进程并调用wait()

(5).信号SIGCHLD

当子进程终止时,内核都会向父进程发送SIGCHLD信号,对该信号的默认处理是将其忽略,不过我们可以安装信号处理函数,来处理它,以收拾僵尸进程

(6)程序的执行

#include<unistd.h>
int execve(const char *pathname,char *const argv[],char *const envp);
//不返回则成功,-1则失败

参数pathname包含准备载入当前进程空间的新程序的路径名,参数argv则指定了传递给新程序的命令行参数,参数envp指定了新程序的环境列表

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-28 16:54:00

进程的相关知识总结的相关文章

linux 创建守护进程的相关知识

linux 创建守护进程的相关知识 http://www.114390.com/article/46410.htm linux 创建守护进程的相关知识,这篇文章主要介绍了linux 创建守护进程的相关知识,需要的朋友可以参考下 关键字:linux.守护进程 创建子进程,父进程退出 这是编写守护进程的第一步.由于守护进程是脱离控制终端的,因此,完成第一步后就会在Shell终端里造成一程序已经运行完毕的假象.之后的所有工作都在子进程中完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到

知识回顾、进程的相关知识和操作

1.编程语言的发展: 机器语言:二进制 汇编语言:指令,命令形式的 高级语言:面向过程(C)面向对象(python,c++,java) 2.操作系统的目标: 为了使用户更方便的使用系统 3.计算机的组成: cpu,主板,存储,输入,输出 4.并行.并发 并发:指两件或多件事情,在同一时间间隔内同时执行(宏观上是并行,微观上是串行) 并行:指两件或多件事情,在同一时间间隔内同时执行 5.进程有三部分组成: 代码段,数据段,PCB(进程控制块) 6.进程的三种基本状态: 就绪状态:除了cpu之外,进

进程 &amp; 线程相关知识

不管Java,C++都有进程.线程相关的内容.在这里统一整理吧. Python的线程,其实是伪线程,不能真正的并发.下面也有讲. 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈). 多个线程共享内存. 参考了这篇文章:http://www.cnblogs.com/qiaoconglovelife/p/5319779.html 进程与PCB 进程:进程是程序的一次执行过程,是系统进行资源分配和调度的一个独立单位. 进程实体(进程映像):由程序段.相关数

进程的相关知识

1,对多进程的模块:  multiprocess   Process是进程的模块 form multiprocessing import Process从multiprocessing包中导入Process模块 multiprocess是python中的一个操作管理进程的一个包,multi是取自multiple的多功能的意思,在这个包中,几乎包含了和进程操作的所有模块,有与子模块非常多,为了方便大家学习可以分为四个部分:创建进程部分,进程池部分,进程同步部分,进程之间数据共享 2,进程的并行与并

Linux进程快照相关知识

查寻内核版本 uname  -a    //  uname  -r 进程快照 ps       report a snapshot of the current processes USER        进程所属用户 PID 进程ID   进程号 %CPU        进程占用CPU百分比 %MEM 进程占用内存的百分比 VSZ 虚拟内存 RSS         真实内存 TTY 终端  terminal STAT 进程的状态 主要状态   (NOTE: 主机状态一条进程只有一个) D  

进程和cpu的相关知识和简单调优方案

进程就是一段执行的程序,每当一个程序运行时,对于操作系统本身来说,就创建了一个进程,并且分配了对应的资源.进程可以分为3个类别: 1.交互式进程(I/O) 2.批处理进程 (CPU) 3.实时进程 (REAL-TIME) 对于交互式进程来说,一般其占用的cpu时间片很段,但是优先级偏高;批处理进程占用的cpu时间片很长,但是优先级偏底;实时进程是内核所使用的,其优先级高于前面两种. 上面说到了优先级,linux进程是具有优先级的,一般分为两种: 1.实时优先级 2.静态优先级 实时优先级的取值范

深入浅出安卓学习相关知识,如何从零学好移动开发

原文发表自我的个人主页,欢迎大家访问 http://purplesword.info/mobile-develop 由于近几年来互联网的飞速发展,安卓和iOS平台的大量普及推广,移动开发在当前是非常热门的一个方向. 有不少同学问我如何学习安卓,要学些什么,难不难学.之前一直没有想好应该怎么回答这个问题,只是简单的说安卓自身门槛不高,并不难学.因为我觉得准确回答一个类似这样的问题往往需要灵感.现在根据我的学习体验,做个大概的总结. 1.我为什么学安卓 我从刚开始接触安卓开发到现在也有两三年的时间了

OSPF相关知识与实例配置

OSPF相关知识与实例配置[基本知识及多区域配置] OSPF(开放式最短路径优先协议)是一个基于链路状态的IGP,相比于RIP有无环路:收敛快:扩展性好等优点,也是现在用的最多的:所以这次实验就针对于OSPF(HCNA)内容进行一个探究: 在说ospf配置前:我们先来了解下ospf LSA的类型: type1 LSA:每个ospf路由器都会产生type1 LSA:描述了对应设备接口的物理接口所连接的链路或接口,并且表明了个链路的状态.开销等参数:(只在区域内泛洪) Type2 LSA:网络LSA

oracle等待事件的相关知识

一. 等待事件的相关知识: 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件. 1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候,不用过多注意这部分事件. 2). 非空闲等待事件专门针对ORACLE的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件是在调整数据库的时候需要关注与研究的. 在Oracle 10g中的等待事件有872个,11g中等待事件1116个. 我们可以通过v$event_name 视图来查看等待