进程控制 (二) Others
1. 執(zhí)行新程序
只列出幾個(gè)常用的函數(shù):
#include <unistd.h> int execve(const char *path, char * const argv[], char * const envp[]);//envp[]為環(huán)境變量,可直接調(diào)用int execv(const char *path, char * const argv[]);//與execve()類似int execvp(const char * path, char * const argv[]);//path新程序的名稱??正常情況下,這些函數(shù)不會(huì)返回,因?yàn)檫M(jìn)程的執(zhí)行映像已經(jīng)被替換,沒(méi)有剖接收返回值的地方。若發(fā)生錯(cuò)誤,則返回-1.
??新程序的進(jìn)程保持了原來(lái)進(jìn)程的進(jìn)程ID、父進(jìn)程ID、實(shí)際用戶ID和用戶組ID。同時(shí),調(diào)用新程序后,原有的子進(jìn)程的映像被替代,不再被執(zhí)行。
2. 等待進(jìn)程結(jié)束
#include <sys/types.h> #include <wait.h>pid_t wait(int *statloc); pid_t waitpid(pid_t pid, int *statloc, int options);/*參數(shù)statloc指向的變量存放子進(jìn)程的退出碼(int型),即從子進(jìn)程main函數(shù)返回的值或子進(jìn)程中exit函數(shù)的參數(shù) */wait/waitpid有關(guān)宏定義:
??WIFEXITED(stat_val) : 子進(jìn)程正常結(jié)束,該宏返回非零值;有異常,返回0
??WEXITSTATUS(stat_val) : 獲取子進(jìn)程的退出碼
??由于stat_val的信息存儲(chǔ)在其二進(jìn)制,難以直接讀取,故用宏來(lái)獲取退出碼。(子進(jìn)程若exit(num), 則獲取的退出碼即num)
3. 進(jìn)程ID
#include <sys/types.h> #include <unistd.h>int setuid(uid_t uid); int setgid(gid_t gid);若進(jìn)程具有root權(quán)限,則函數(shù)將實(shí)際用戶ID、有效用戶ID設(shè)置為uid;
若進(jìn)程不具有root權(quán)限,但uid等于實(shí)際用戶ID,則致敬有效用戶ID設(shè)為uid;
若兩個(gè)條件都不滿足,函數(shù)調(diào)用是失敗,返回 -1 .
只有超級(jí)用戶進(jìn)程才可以改變實(shí)際用戶ID.內(nèi)核對(duì)進(jìn)程存取文件的許可權(quán)的檢查,是通過(guò)檢查進(jìn)程的有效用戶ID來(lái)實(shí)現(xiàn)的,所以普通用戶可以通過(guò)暫時(shí)獲得root權(quán)限來(lái)操作文件。
4. 實(shí)現(xiàn)shell過(guò)程中的操作
1)readline函數(shù)庫(kù)
??調(diào)用該函數(shù)庫(kù)可直接實(shí)現(xiàn)命令行方向鍵的使用、光標(biāo)移動(dòng)、自動(dòng)補(bǔ)全、查看命令歷史記錄。
int main() {char* input, shell_prompt[100];rl_bind_key('\t', rl_complete);for(;;) {snprintf(shell_prompt, sizeof(shell_prompt), "%s:%s $ ", getenv("USER"), getcwd(NULL, 1024));input = readline(shell_prompt);if (!input)add_history(input);free(input);//數(shù)組不用后要釋放,避免內(nèi)存泄露} }2) vfork使用注意事項(xiàng)
??因?yàn)橛胿fork創(chuàng)建的子進(jìn)程與父進(jìn)程共享資源,包括堆棧區(qū)等數(shù)據(jù),如果在子進(jìn)程使用return結(jié)束進(jìn)程,在進(jìn)程結(jié)束后系統(tǒng)會(huì)回收該進(jìn)程鎖占用的資源,也就導(dǎo)致父進(jìn)程在繼續(xù)運(yùn)行時(shí)之前所有資源都已“消失”,會(huì)發(fā)生段錯(cuò)誤,而使用exit退出時(shí),則是直接退出進(jìn)程,不會(huì)進(jìn)行資源的回收,所以不會(huì)出錯(cuò)。
3) Linux終端printf控制輸出顏色及格式
格式:
printf(“\033[字背景顏色;字體顏色m字符串\033[0m” );
printf(“\033[41;32m字體背景是紅色,字是綠色\033[0m\n”);
41是字背景顏色, 32是字體的顏色, 字體背景是紅色,字是綠色是字符串. 后面的\033[0m是控制碼.
顏色代碼:
字背景顏色范圍: 40--49 字顏色: 30--3940: 黑 30: 黑41: 紅 31: 紅42: 綠 32: 綠43: 黃 33: 黃44: 藍(lán) 34: 藍(lán)45: 紫 35: 紫46: 深綠 36: 深綠47: 白色 37: 白色ANSI控制碼:
\033[0m 關(guān)閉所有屬性
\033[1m 設(shè)置高亮度
\03[4m 下劃線
\033[5m 閃爍
\033[7m 反顯
\033[8m 消隱
\033[30m – \033[37m 設(shè)置前景色
\033[40m – \033[47m 設(shè)置背景色
\033[nA 光標(biāo)上移n行
\03[nB 光標(biāo)下移n行
\033[nC 光標(biāo)右移n行
\033[nD 光標(biāo)左移n行
\033[y;xH設(shè)置光標(biāo)位置
\033[2J 清屏
\033[K 清除從光標(biāo)到行尾的內(nèi)容
\033[s 保存光標(biāo)位置
\033[u 恢復(fù)光標(biāo)位置
\033[?25l 隱藏光標(biāo)
\33[?25h 顯示光標(biāo)
友情鏈接:
http://blog.csdn.net/yi412/article/details/46867137
http://www.linuxidc.com/Linux/2011-03/32903.htm
總結(jié)
以上是生活随笔為你收集整理的进程控制 (二) Others的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 文件操作(二) 其他总结
- 下一篇: 线程控制(一)