1. 程式人生 > >linux的waitpid 和wait 以及fg 和bg命令

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

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