天天看点

linux的waitpid 和wait 以及fg 和bg命令waitpid函数说明:wait函数说明:fg 和bg

 接上篇: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 来决定了。