您的位置:首页 > 大数据 > 人工智能

linux的waitpid 和wait 以及fg 和bg命令

2014-03-08 11:43 295 查看
 接上篇:linux
的nohup & 和daemon 总结, 这里总结下waitpid和bg 和fg命令

waitpid函数说明

#include<sys/types.h>
#include<sys/wait.h>
定义函数 pid_twaitpid(pid_t pid,int * status,int options);
其他数值意义如下:
pid<-1 等待进程组识别码为
pid 绝对值的任何子进程。
pid=-1 等待任何子进程,相当于 wait()。
pid=0 等待进程组识别码与目前进程相同的任何子进程。
pid>0 等待任何子进程识别码为 pid的子进程。
 

wait函数说明:

#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status)
进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
wait是基于waitpid来实现的:
static inline pid_t wait(int *wait_stat)
{
 return waitpid(-1,wait_stat,0);
}

fg 和bg

   前面介绍了两个函数,而在linux中shell中运行程序的时候,我们可以通过键盘crtl + z 组合键来暂停一个作业。并可以用bg将其在后台继续运行,或者用fg将其恢复前台运行。

  而根据个人理解,其实现的原理就是用到了waitpid和信号逻辑。当用户按下CTRL-Z时,向前台进程组发送SIGTSTP信号以暂停进程(默认动作),该信号可以被忽略和重定义。

(注SIGTSTP和SIGSTOP的唯一区别:将进程暂停是SIGTSTP的默认action,用户可以自定义一其handler,而将进程暂停是SIGSTOP的定死的action,用户不能修改。此外,二者没什么差别,都使用SIGCONT来讲进程重新激活。) 而bg和fg就可以通过触发SIGCONT信号来是的进程继续运行。至于是前台还是后台,则是shell的主进程是否要对子进程执行waitpid 来决定了。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell bg fg waitpid wait