天天看點

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 來決定了。