Unix中的程序

2021-06-26 10:53:35 字數 2566 閱讀 4222

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...