接上篇: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 來決定了。