进程函数一步步理解Linux进程(2)--进程编程进程函数
生活随笔
收集整理的這篇文章主要介紹了
进程函数一步步理解Linux进程(2)--进程编程进程函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
查了好多資料,發現還是不全,干脆自己整理吧,至少保證在我的做法正確的,以免誤導讀者,也是給自己做個記錄吧!
????
0. 說明????
????
作者:Gao Peng<gaopenghigh@gmail.com>????
本文章由Gao Peng編寫,轉載請注明出處。????
原文址地: http://blog.csdn.net/gaopenghigh/article/details/8829832????
????
????
1. 獲得各種ID????
????
在“一步步懂得Linux進程(1)--基礎知識”中我們論討了幾種ID:PID, PPID, PGID, SID。另外Linux中還有用戶ID(UID), 效有用戶ID(EUID), 用戶組ID(GID), 效有用戶組ID(EGID)等,面下這些函數恰是用來獲得這些ID: #include <unistd.h> pid_t getpid(void); pid_t getppid(void); pid_t getpgid(pid_t pid); /* pid為0時則返回用調進程的進程組ID */ pid_t getsid(pid_t pid); /* pid為0時則返回用調進程的會話首進程的ID */ uid_t getuid(void); uid_t geteuid(void); gid_t getgid(void); gid_t getegid(void);????
????
2. fork函數????
????
fork函數多是Linux中最著名的函數了。一個現有進程可以用調fork函數建創一個新進程。 #include <unistd.h> pid_t fork(void);很有意思的是,用調fork函數時,生產了子進程,而fork函數分別在父進程和子進程中都有返回,其中在父進程中返回子進程的PID,子進程中則返回0。子進程中的一切都是從父進程copy去過的(事實上,Linux用了“寫時復制”的技巧,也就是指直到真正對數據生產寫操縱時,這些資源才真的被copy)。fork的一個用使示例如下: #include <unistd.h> #include <stdio.h> int main(void) { int var = 10;pid_t pid;if ((pid = fork()) < 0) {printf("fork error\n");} else if (pid == 0) { /* child */printf("in child, ");var++;} else { /* parent */printf("in parent, ");var--;}printf("pid=%d, ppid=%d, var=%d\n", getpid(), getppid(), var);return 0; }
編譯并運行這個序程: $ gcc -Wall fork_test.c $./a.out in parent, pid=21319, ppid=18586, var=9 in child, pid=21320, ppid=21319, var=11
正如我們想預的那樣,變量var分別在父進程和子進程中被-1和+1。
????
????
????
3. exit函數和atexit函數????
????
3.1 exit????
有3個函數用于畸形止終一個序程: #include <stdlib.h> void exit(int status); void _Exit(int status); #include <unistd.h> void _exit(int status);其中,_exit和_Exit直接進入核內,exit則是先用調執行各止終處置序程(exit handler),然后關閉全部準標IO流,最后才進入核內。三個函數中,參數status都表現止終狀態。 子進程止終時,核內并沒有全完抹去這個進程的一切,而是保存以必定的信息,比如PID,止終狀態,用使的CPU間時總量等等。父進程可以通過wait系列函數獲得到這些信息,然后再根據實際需要做更多的處置。在子進程已結束但父進程還沒有去獲得這些信息這段間時內,子進程叫做僵尸進程(zombie process)。 每日一道理
今天陽光很好,坐在窗前,看窗外如此晴朗的天感覺特別舒心,雨過天晴后的世界總給人一種明媚,仿佛陽光照耀在“心田”上空,讓前些天被風雨踐踏的花朵重新得到愛的關懷,重現生命的活力!
????
子進程和父進程獨立運行,但當子進程止終時,統系會給父進程發送一個SIGCHLD信號,父進程可以捕獲這個信號并做響應的處置,但Linux中默許對次信號疏忽。????
????
3.2 atexit????
面前說過,exit函數會先用調執行各止終處置序程(exit handler)。這些止終處置序程,恰是通過atexit函數冊注的: #include <stdlib.h> int atexit(void (*func)(void));其中,atexit的參數是一個函數址地,用調此函數時無需送傳任何參數,也不期望它返回一個值。一個進程可以冊注32個止終處置序程,exit用調這些函數的序順與它們冊注的序順相反。
????
????
4. wait系列函數
4.1 wait和waitpid函數 子進程止終后,核內仍然保存該進程的一些信息,這些信息可以通過wait和waitpid函數來獲得。 #include <sys/wait.h> pid_t wait(int *statloc); pid_t waitpid(pid_t pid, int *statloc, int options);
這兩個函數若執行功成則返回進程PID或者0,錯出則返回-1。
執行這兩個函數時, a. 如果其全部子進程都還在運行,則阻塞,直到有子進程止終; b. 如果沒有子進程,則錯出返回-1; c. 如果一個子進程已止終并等待父進程獲得其止終狀態,則取得其PID當即返回; 參數statloc是形整指針,當該參數不為NULL時,子進程的止終狀態就存入該指針指向的元單內。
waitpid和wait的的區分是: a. waitpid可以等待一個指定的進程止終,所等待的進程由參數pid供給: pid == -1 ? 等待任一子進程 pid > 0 ? ? 等待進程PID與pid等相的進程,若不存在,則錯出返回 pid == 0 ? ?等待PGID于等用調進程PGID的任一子進程 pid < 0 ? ? 等待其PGID于等pid絕對值的任一子進程 b. waitpid中的第三個參數options,options可所以0,也可所以以下三個值按位“或”的結果: WCONTINUED ?由pid指定的進程在暫停后繼承,且未尚告報其狀態,則返回其狀態 WNOHANG ? ? waitpid不阻塞,返回0 WUNTRACED ? 由pid指定的進程處于暫停狀態,且該狀態為告報過,則返回其狀態
4.2 waitid函數 可以看到,waitpid函數中參數pid的用作夠不純粹,增加了代碼的復雜度,降低了可讀性。waitid函數與waitpid似類,但waitid用獨自的參數表現要等待的子進程的類型。 #include <unistd.h> int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
詳細用使方法可考參waitid的man手冊。
4.3 wait4函數 與wait, waitpid, waitid比相,wait4函數多了一個能功:要求核內返回進程用使的資源匯總。詳細可考參wait4的man手冊。
5. exec系列函數
????
????
當進程用調一種exec函數時,改進程執行的序程全完替換為新序程,新序程由exec函數的參數指定。 #include <unistd.h> 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 argv[]); int execvp(const char *file, char *const argv[]); int execvpe(const char *file, char *const argv[], char *const envp[]);可以用exec函數中的母字l, v, p, e對這6個函數做區分: l ? ?表現list,要求將新序程的個每命令行參數都表現為一個獨立的參數
????
v ? ?表現vector,與list對應,先造構一個指向全部參數的指針數組,然后把該數組址地作為參數傳給exec????
p ? ?表現用使file作為參數,在PATH中找尋對應的文件,file中含有"/"則視作徑路????
e ? ?表現可以傳遞一個指向境環字符串指針數組的指針,指向的字符串作為境環變量????
????
考參資料:
????
《UNIX境環級高編程》????
“UNIX進程揭秘”? http://www.ibm.com/developerworks/cn/aix/library/au-unixprocess.html文章結束給大家分享下程序員的一些笑話語錄: 姿勢要豐富,經常上百度!
轉載于:https://www.cnblogs.com/jiangu66/archive/2013/04/21/3033360.html
總結
以上是生活随笔為你收集整理的进程函数一步步理解Linux进程(2)--进程编程进程函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET操作Excel(终极方法N
- 下一篇: linux 其他常用命令