APUE 程序一瞥

2021-09-19 07:58:14 字數 3139 閱讀 2196

程式:存放在磁碟檔案中的可執行檔案

程序:程式執行的例項(process)

cmd: ps ,top

程序id:每個程序都有乙個非負整數標識的唯一程序id

0是排程程序,1是init程序,(大多數unix系統)2是頁守護程序page daemon

/*除了程序id,程序還可以用下面的函式返回其他的標誌符*/

#include pid_t getpid(void);                           返回:呼叫程序的程序id   

pid_t getppid(void);                          返回:呼叫程序的父程序id   

uid_t getuid(void);                           返回:呼叫程序的實際使用者id   

uid_t geteuid(void);                          返回:呼叫程序的有效使用者id   

gid_t getgid(void);                           返回:呼叫程序的實際組id   

gid_t getegid(void);                          返回:呼叫程序的有效組id

在linux中,建立新程序的唯一方法是某個已經存在的程序呼叫fork()函式,新建立的程序是子程序,已存在的稱為父程序。

#include pid_t fork(void);
fork()函式是乙個系統呼叫,當父程序呼叫fork()時,fork()返回兩個值:父程序會返回子程序的pid,這是個大於0的整數,而子程序會返回0。父程序和子程序會繼續執行fork()之後的語句,子程序會繼承父程序的資料空間、堆和棧的副本,但是不共享儲存空間。寫時複製(copy-on-write)技術:核心將(資料段、棧和堆)的許可權改為唯讀,父程序和子程序中的任乙個想要修改副本,則核心只為修改區域的那塊記憶體製作乙個副本,通常是虛擬記憶體中的一頁page。

fork()的兩種用法:

1.乙個父程序複製自己,使父程序和子程序同時執行不同的**段

2.乙個父程序複製自己,要執行不同的程式

#include pid_t vfork();
vfork()和fork()的區別:

1.vfork子程序和父程序共享資料段,fork則不共享

2.vfork的子程序比父程序先執行,在它呼叫exec或者exit之後,父程序才會開始執行

程序有5種正常終止程序和3種異常終止程序的方法

1.在main函式中使用return

2.呼叫eixt函式

3.呼叫_exit或者_exit函式

4.程序的最後乙個執行緒在其啟動例程中執行return語句

5.程序的最後乙個執行緒呼叫pthread_exit

1.呼叫abort()

2.當程序接收到某些訊號時

3.最後乙個執行緒對「取消」請求做出響應

不管程序如何終止,最後都會執行核心裝的同一段**。這段**會關閉程序所有的描述符,釋放它的儲存器

若父程序在子程序結束前終止,則子程序會成」孤兒」程序,init會成為這個程序的」養父」

乙個已經終止,但是父程序並未進行善後處理的程序成為僵死程序(zombie),ps狀態z

#include int atexit(void (*func)(void));
atexit是乙個退出程序註冊函式。exit執行時會先執行atexit註冊的函式,且多次註冊多次執行,先執行後註冊的函式。

區別在於exit會先執行一些清理處理(例如沖洗i/o),然後返回核心,而_exit和_exit會直接返回核心

#include pid_t wait(int *status);

pid_t waitpid(pid_t pid, int *status, int options);

wait和waitpid都是阻塞的函式,但是waitpid可以設定為非阻塞,option設定為wnohang

#include extern char **environ;

int execl(const char *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

int execle(const char *path, const char *arg,

..., char * const envp);

int execv(const char *path, char *const ar**);

int execvp(const char *file, char *const ar**);

int execvpe(const char *file, char *const ar**,

char *const envp);

如:execlp("/bin/echo", "echo", "hello", (char *)0)

#include int system(const char *cmdsting);
system可以在程式中執行乙個命令

程序建立和終止時會建立程序會計以及寫入資料,因此一直執行的程序是沒有程序會計檔案的,如init程序

程序可以通過改變nice值來修改優先順序,nice值越大,優先順序越低

#include #include int nice(int nice);

int getpriority(int which, id_t who);

int setpriority(int which, id_t who, int value);

nice值基於0~2*nzero-1,

nzero可以通過sysconf(_sc_nzero)獲取

nice()可以返回-1,因此,返回-1不能判定失敗,需要同時檢視errno是否為不為0

#include #include struct rusage ;

clock_t times(struct tms *buf);

int getrusage(int who, strcut rusage*rusage);

AutoMapper用法一瞥

首先 如下 var startuptasktypes typefinder.findclassesoftype var startuptasks new list foreach var startuptasktype in startuptasktypes startuptasks.add ist...

javascript ruby和C效能一瞥 2

好吧,最後讓我們用c來實現,看看再能榨取多少效能。注意我沒有改變演算法,c的演算法和之前的3種都是基本相同的 include include include include include include include typedef unsigned long long ull if faile...

瞞天過海html檔案技術一瞥

很多的站點的字尾都是html檔案,甚至有的站點竟然有這樣的檔案字尾html?url asp888.net,有的 朋友可能就會非常的迷惑,難道html 檔案也可以向 asp 檔案一樣程式設計嗎?其實 大家都被欺騙了 我在這裡給大家講一下這個 瞞天過海的 技術是怎麼實現的?首先我們需要做一些準備工作 建...