APUE學習筆記 8 1 8 4 程序基礎

2022-08-03 05:39:13 字數 3188 閱讀 8706

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$ ./exe 

a 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$ ./exe 

before 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,而且程序組...