Linux進程控制詳解及實例
Linux進程控制詳解及實例
常用函數(shù):
- fork() 通過復制調用進程來建立新的進程,是最基本的進程建立操作。
- exec 包括一系列的系統(tǒng)調用,其中每個系統(tǒng)調用都完成相同的功能,即通過用一個新的程序覆蓋原內(nèi)存空間,來實現(xiàn)進程的轉變。各種exec系統(tǒng)調用之間的區(qū)別僅在于它們的參數(shù)構造不同。
- wait() 它提供了初級的進程同步措施,能使一個進程等待,直到另一個進程結束為止。
- exit() 常用來終止一個進程的運行。
進程的建立
如果fork()調用成功,就會使內(nèi)核建立一個新的進程,所建的新進程是調用fork()進程的副本。也就是說,新的進程運行與其創(chuàng)建者一樣的程序,其中的變量具有與創(chuàng)建進程變量相同的值。
系統(tǒng)調用fork()沒有參數(shù),它返回一個pid_t類型的值pid。pid被用來區(qū)分父進程和子進程。在父進程中pid被置為一個非0的正整數(shù);在子進程中,pid被置為0。
進程的運行
exec系列調用:
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[]);
由于參數(shù)的個數(shù)是任意的,所以必須用一個null指針來標記參數(shù)表的結尾。下面給出一個使用execl()和execv()調用來運行l(wèi)s的例子:
/*execl的例子*/ #include <stdio.h> #include <unistd.h> main(){ printf("Excuting ls\n"); execl("/bin/ls", "ls", "-l", NULL); /*如果execl返回,說明調用失敗*/ perror("execl failed to run ls"); exit(1); } /*execv的例子*/ #include <stdio.h> #include <unistd.h> main(){ char *cmd[]={"ls", "-l", NULL}; execv("/bin/ls", cmd); perror("execv failed"); exit(1); }
系統(tǒng)調用execlp()和execvp()分別類似于系統(tǒng)調用execl()和execv(),它們的主要區(qū)別是:execlp()和execvp()的第一個參數(shù)指向的是一個簡單的文件名,而不是一個路徑名。它們通過檢索shell環(huán)境變量PATH指出的目錄,來得到該文件名的路徑前綴部分。
exec和fork()的聯(lián)用
通過聯(lián)用可以實現(xiàn)父進程運行一個與其不同的子進程,并且父進程不會被覆蓋。下面給出一個 exec和fork()聯(lián)用的例子:
#include <stdio.h> #include <unistd.h> main(){ int pid; /*fork子進程*/ pid = fork(); switch(pid){ case -1: perror("fork failed."); exit(1); case 0: execl("/bin/ls", "ls", "-l", NULL); perror("execl failed."); exit(1); default: wait(NULL); printf("ls completed.\n"); exit(0); } }
在fork()調用之前,只有一個進程A,fork()調用后就有了進程A和B。A是父進程,它正在執(zhí)行系統(tǒng)調用wait(),使進程A睡眠,直至進程B結束。同時進程B正在用execl裝入命令ls。exec調用后,進程B的程序被ls的代碼取代,執(zhí)行l(wèi)s命令的代碼。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
Shell腳本實現(xiàn)獲取網(wǎng)頁快照并生成縮略圖
這篇文章主要介紹了Shell腳本實現(xiàn)獲取網(wǎng)頁快照并生成縮略圖,本文獲取網(wǎng)頁快照使用phantomjs、生成縮略圖使用ImageMagick,需要的朋友可以參考下2015-02-02Linux使用iptables實現(xiàn)屏蔽ip地址的示例詳解
netfilter/iptables(簡稱為iptables)組成Linux平臺下的包過濾防火墻,與大多數(shù)的Linux軟件一樣,這個包過濾防火墻是免費的。本文就來利用iptables實現(xiàn)屏蔽ip地址,需要的可以參考一下2022-10-10很實用的Linux 系統(tǒng)運維常用命令及常識(超實用)
作為Linux運維,需要了解Linux操作系統(tǒng)的基本使用和管理知識,下面腳本之家小編給大家介紹下Linux運維需要掌握的命令,想成為Linux運維的朋友可以來學習一下2016-10-10awk實現(xiàn)Left、join查詢、去除重復值以及局部變量講解例子
這篇文章主要介紹了awk實現(xiàn)Left、join查詢、去除重復值以及局部變量講解例子,awk的高級使用技巧,需要的朋友可以參考下2014-07-07