1 程序id是唯一的。(不會有程序id一樣的兩個程序)
2程序id是可復用的,乙個程序銷毀後,它的id號可以被新的程序使用。但是unix採用了延遲復用的演算法,也就是程序 銷毀後它的id不會立即被使用。
3 程序id為0的是排程程序。這是系統程序,是核心的一部分。
4 程序id為1的是init程序。init程序讀取初始化檔案/etc/rc*files 或者/etc/inittab,以及在/etc/init.d中的檔案,使系統處於 某種狀態。init程序是使用者程序,而不是系統程序。
程序id相關函式
[cpp]view
plain
copy
#include
pid_t getpid(void
);
returns: process id of calling process
pid_t getppid(void
);
returns: parent process id of calling process
uid_t getuid(void
);
returns: real user id of calling process
uid_t geteuid(void
);
returns: effective user id of calling process
gid_t getgid(void
);
returns: real group id of calling process
gid_t getegid(void
);
returns: effective group id of calling process
#include pid_t fork(void);returns: 0 in child, process id of child in parent,−1 on error
unix可以使用系統函式fork()建立乙個新程序。
fork()執行一次返回兩次。
返回值:
0:表示子程序
子程序id: 表示父程序
子程序可以通過getppid()來獲取父程序id,所以只需要返回0,表示建立成功即可.而對於父程序來說,他無從得知子程序的id,因此在建立的時候就應該吧子程序的id號返回給他。
我們知道,每個程序都會涉及到程序控制塊、正文段、資料段,三部分內容。
程序控制塊是每個程序獨有的,這就不用多說。
正文段裡面是程式的指令,都是唯讀的,因此父程序和子程序可以共享這部分內容 。share
資料段: 子程序會拷貝乙份父程序的資料段(資料空間、堆、棧)。注意:這裡是copy而不是share
由於我們知道,一般建立子程序後,高階著就是使用exec替換子程序為乙個新的程式了,這是父程序的資料段內容就沒什麼用了。因此,現代系統在實現的時候,採用了寫時複製copy-on-write(cow)。該方法就是核心將資料段設定為共享share,但它是唯讀的,當父程序或者子程序下需要對資料進行修改時,就自己copy乙個副本。
example
#include "apue.h"#include "myerr.h"
int globvar=6;/*external variable in initialized data */
char buf = "a write to stdout\n";
intmain(void)
else if (pid == 0) else
printf("pid = %ld, glob = %d, var = %d\n", (long)getpid(), globvar, var);
exit(0);
}
執行結果:
windeal@ubuntu:~/windeal/apue$ ./exea write to stdout
before fork
pid = 4523, glob = 7, var = 89
pid = 4522, glob = 6, var = 88
windeal@ubuntu:~/windeal/apue$
在這個例子中,我們在子程序中對globvar和var都進行自加,然後又在父程序中sleep(2),使得子程序先執行。
最終結果,父程序的資料都沒變,子程序globvar和var都變成了新的值。
從例子中可以看出,正文段是共享的,都使用了printf語句(你要說是copy,我就不跟你辯了。。。)
vfork()
功能與fork()基本相似。
不同點:
vfork保證子程序先執行,也就是子程序執行了exec程式或者exit後才執行fork()。如果子程序中有依賴父程序的下一步動作才能執行的部分,可能會導致死鎖。
vfork建立的子程序會共享父程序的資料段。也就是說它會改變父程序的資料。
#include "apue.h"#include "myerr.h"
int globvar=6;/*external variable in initialized data */
intmain(void)
else if (pid == 0)
/* parent continues here */
printf("pid = %ld, glob = %d, var = %d\n", (long)getpid(), globvar, var);
exit(0);
}
執行結果:
windeal@ubuntu:~/windeal/apue$ ./exebefore vfork
pid = 6298, glob = 7, var = 89
windeal@ubuntu:~/windeal/apue$
可以看到父程序globvar和var被子程序改變了。
vfork()被一些版本視為過時的介面,一般不使用。所以不必過多研究,多用fork()來建立新程序即可。
APUE學習筆記 19 守護程序
by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 13章。2.總結了守護程序的基本概念 程式設計規則以及如何進行出錯處理。3.守護程序 守護程序也稱精靈程序 daemon 是生存期較長的一種程序。它們常常在系統自舉時啟動,...
APUE學習筆記 程序控制
1.getpid可以獲取程序id。getppid可以獲取程序呼叫程序的id。2.fork函式 一次呼叫,兩次返回 返回0是在子程序中。返回其他值在父程序中。如果大於0為子程序id 否則失敗。3.子程序獲得了父程序的資料空間 data,bss 堆,棧的副本。程序之間共享正文段。4.目前的實現一般不進行...
APUE 筆記 守護程序
1.daemon 是後台程序 後台程序有些是核心的 kernel daemons 通常他們的父程序號是0,他們在系統啟動階段啟動 有些是使用者層的 user level daemons 所有使用者層後台程式是 process group leaders 和 session leaders,而且程序組...