系统调用exit和wait
来源:互联网 发布:servu端口设置 编辑:程序博客网 时间:2024/05/21 03:59
在Unix OS中,通过执行系统调用exit来终止一个进程。进程可以显示的调用exit系统调用来终止一个进程,也可以通过在程序结束时的return来实现(startup routine调用exit当一个C程序从main函数返回时)。
调用exit方式如下:
exit(status);
status是返回给父进程的终止code。当一个进程exit后,这个进程处于zombie state。
exit系统调用的执行发生以下事件:
1,清除当前进程的所有信号处理函数。
2,如果当前进程是和终端关联的“进程组组长”,则会向每个组内进程发送hang-up signal,并且把这些成员的进程组设置为0。
3,通过内核内部算法关闭当前进程所有打开的文件描述符,并且释放当前目录所关联的inode;如果存在current (charged)root,也将其释放通过算法iput。
4,为进程释放所有的region以及关联的memory。
5,计算进程机器子进程执行的时间(user mode 和kernel mode),并把记录写到一个全局的accounting file。
6,将进程的状态改变为zombie,并将自己的所有的子进程的父进程ID设置为1(init);如果有孩子的状态是zombie,向init进程发SIGCHLD信号,以清除子进程的process table slot。
7,exiting进程向自己的父进程发送SIGCHLD信号。
8,进行context switch,调度其他非zombie进程(本进程已经是zombie)。
当一个进程的子进程exit后,自己可以通过wait系统调用获取子进程的exit status。
pid = wait(stat_addr);
pid是exit子进程的进程ID,stat_addr是本进程用户空间的一个变量,用于存放exit子进程的exit status。
当wait执行时,内核搜寻本进程的zombie子进程,如果本进程没有子进程,则返回error。否则,提取子进程的进程进程ID和exit status。同时,内核将计算子进程的执行时间(user mode 和 kernel mode),记录到本进程u area的相应field中,然后释放子进程占有的process table slot。
当调用wait时,如果没有子进程处于zombie state,则父进程睡眠在一个可以被中断的状态,直到有信号的到来。其他信号处理方式如前所述(signal篇),但对SIGCHLD信号有特殊的处理:
1,默认的情况下,父进程从sleep中醒来,出发issig算法检查信号类型。如果issig得知是SIGCHLD,则issig返回false,相应内核将不会执行longjmp但是返回到wait。此时,内核将循环检查是否有子进程处在zombie状态,如果至少有一个子进程处于zombie状态,则释放此子进程的process table slot,并从wait返回。
2,如果父进程设置了SIGCHLD处理函数,内核将调用此处理函数。
3,如果父进程显式设置了“忽略”SIGCHLD信号,wait将循环检查所有的(区别于1)子进程是否有子进程处于zombie状态,并释放所有它们的process table slot。直到发现没有子进程存在,wait将会返回-1。
注:在UNIX旧的版本中,当exiting子进程退出时,不是向父进程发送信号,而是将父进程唤醒。此时,如果父进程执行了wait系统调用,将会检查处于zombie状态的子进程,并将释放它们的process table slot。否则就好像什么没发生。所以,这种实现方式的不足是,如果父进程没有执行wait系统调用,并且有很多子进程处于zombie状态,那么就不能回收它们,知它们将process table slot填满。
现在的实现是通过显式的设置SIGCHLD信号处理方式为“忽略”,当不调用wait时,自动清除zombie子进程的资源。
- 系统调用exit和wait
- Wait和Exit
- 系统调用wait、waitpid和exec函数
- 系统调用wait、waitpid和exec函数
- wait系统调用解析
- wait系统调用
- wait系统调用解析
- MINIX系统调用EXIT分析
- linux下exit系统调用
- 【进程管理】系统调用exit()
- linux中wait系统调用
- linux中wait系统调用
- linux中wait系统调用
- Linux中的wait系统调用
- 【nachos】山东大学操作系统课设实验nachos系统(6)系统调用Exec()和Exit()
- 进程控制之exit和waitpid(wait)函数
- Linux下的exit函数和wait函数
- 进程控制之exit和waitpid(wait)函数
- typedef使用大全1(数组)
- 怎样正确启动mysqld服务
- 修改jsp默认编辑器
- 设置和获取socket buffer size
- 调整控制台的长宽以及文字颜色
- 系统调用exit和wait
- MFC中的标准输出重定向
- 宏定义中使用do{}while(0)的好处
- seo 的含义?解密
- 真机实照 Nokia XpressMusic 5900
- ajax开发易碰到的问题(不断更新中...)
- VC的IDE在编译链接时做了些什么
- 博客正式开通
- mysqld ended问题解决