1:程序id
每個程序都有乙個非負整數表示的唯一程序id。雖然是唯一的,但是程序id可以重用。大多數unix系統實現延遲重用演算法。程序id用pid_t表示。
一下兩個函式用來得到當前程序和父程序的pid。
#includepid_t getpid();//get pid of current processs
pid_t getppid();//get pid of parent process
2:建立新程序
#includepid_t fork();
fork函式被呼叫一次,但返回兩次。子程序返回0,父程序返回子程序的程序id。將子程序id返回給父程序的理由是:因為乙個程序的子程序可以有多個,並且沒有乙個函式可以得到乙個程序的所有子程序的程序id。fork使子程序得到返回值0的理由是:乙個程序只有乙個父程序,並且子程序可以通過getppid得到父程序的程序id。
#include#include#include#includeint glob=6;
char buf="a write to stdout\n";
void printerr(const char* info)
int main()else
printf("pid=%d,glob=%d,var=%d\n",getpid(),glob,var);
return 0;
}
編譯後可執行檔案為test1,
在終端執行 ./test1,輸出如下:
a write to stdout
pid=5272,before fork1
pid=5273,glob=7,var=11
father after waitpid
pid=5272,glob=6,var=10
講輸出重定向到檔案,./test1 >tmp.txt,然後顯示檔案cat tmp.txt,輸出如下:
a write to stdout
pid=5274,before fork1
pid=5275,glob=7,var=11
pid=5274,before fork1
father after waitpid
pid=5274,glob=6,var=10
可見重定向到檔案後多數出了下面一行,是因為緩衝的緣故:write函式沒有緩衝,因此只輸出一行。標準i/o(printf)是有緩衝的,如果輸出到終端裝置是行緩衝的(由於有\n因此緩衝區被沖洗),在終端只輸出一次。標準i/o輸出到檔案是全緩衝的,因此在在子程序的最後一行輸出後會把緩衝區內的內容輸出
pid=5274,before fork1
3:殭屍程序
當父程序fork之後建立了子程序後,如果子程序先結束,並且父程序沒有wait或waitpid等待子程序,那麼子程序變為殭屍程序,知道父程序結束才不是殭屍程序。
如果父程序先結束,那麼子程序的父程序變為init程序。init程序的子程序結束後,init程序會呼叫乙個wait函式取得其終止狀態。
上面的程式子程序很快執行完畢,在父程序執行wait之前子程序變為殭屍程序,wait執行之後就不是殭屍程序了。可以使用下面的命令來檢視當前的殭屍程序。
ps -a -o stat,ppid,pid,cmd | grep -e '^[zz]'
#includepid_t wait(int * statloc);
pid_t waitpid(pid_t pid,int* statloc,int options);
兩個函式返回值:若成功則返回程序id,出錯返回-1
殭屍程序的危害:殭屍程序是乙個執行完畢的程序,所有的資源都已經釋放了,包括開啟的檔案,占用的記憶體等等。但是仍然為其保留一定的資訊(包括程序號,退出狀態,執行時間等),直到父程序通過wait/waitpid來取時才釋放。否則的話這些資訊會一直儲存,程序號就會被一直占用,但是系統所能使用的程序號是有限的,如果產生大量的殭屍程序,將因為沒有可用的程序號而導致系統不能產生新的程序。
解決殭屍程序的方法:如果乙個程序fork乙個子程序,但不要它等待子程序終止,也不希望子程序處於僵死狀態知道父程序終止,實現這一要求的技巧是呼叫fork兩次。
**如下:
#include#include#include#include#includevoid printerr(const char* info)
int main()
sleep(1);
printf("second child,pid=%d,ppid=%d\n",getpid(),getppid());
_exit(0);
}if(waitpid(pid,null,0)!=pid)
printerr("waitpid error\n");
printf("parent pid=%d\n",getpid());
return 0;
}
UNIX中的程序基本概念
the linux programming inte ce 讀書筆記,了解了程序和程序通訊的 一些基本概念,稍加整理。每個程序都有程序號,稱之為pid.每個程序都屬於乙個組,這個組也有乙個 組號 gid 其中有個程序是組長,組號就是這個組長程序的程序號。當然,子程序如果只能靠父程序接濟就太撈了,通過...
UNIX程序的環境
在學習程序之前,先來了解下程序的執行環境。main函式 程序總是從main函式開始執行的,我們程式設計時,程式執行也是從main函式執行的,它的原型如下 int main int argc,char argv argc是命令列引數的數目,argv是指鎮陣列,即指向指標的指標,可以寫 測試一下 inc...
Unix程序環境
1.快取 a.全快取 當填滿標準i o快取後才進行實際i o操作 b.行快取 當在輸入和輸出中遇到新行符時,標準i o庫執行i o操作 2.printf返回值表示成功輸入的字元個數,返回0表示沒有輸出任何字元。unix程序環境 1.int main int a rg c,char a rg v ar...