进程控制 (二) Others
1. 執(zhí)行新程序
只列出幾個常用的函數(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ù)不會返回,因為進程的執(zhí)行映像已經(jīng)被替換,沒有剖接收返回值的地方。若發(fā)生錯誤,則返回-1.
??新程序的進程保持了原來進程的進程ID、父進程ID、實際用戶ID和用戶組ID。同時,調(diào)用新程序后,原有的子進程的映像被替代,不再被執(zhí)行。
2. 等待進程結(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指向的變量存放子進程的退出碼(int型),即從子進程main函數(shù)返回的值或子進程中exit函數(shù)的參數(shù) */wait/waitpid有關(guān)宏定義:
??WIFEXITED(stat_val) : 子進程正常結(jié)束,該宏返回非零值;有異常,返回0
??WEXITSTATUS(stat_val) : 獲取子進程的退出碼
??由于stat_val的信息存儲在其二進制,難以直接讀取,故用宏來獲取退出碼。(子進程若exit(num), 則獲取的退出碼即num)
3. 進程ID
#include <sys/types.h> #include <unistd.h>int setuid(uid_t uid); int setgid(gid_t gid);若進程具有root權(quán)限,則函數(shù)將實際用戶ID、有效用戶ID設(shè)置為uid;
若進程不具有root權(quán)限,但uid等于實際用戶ID,則致敬有效用戶ID設(shè)為uid;
若兩個條件都不滿足,函數(shù)調(diào)用是失敗,返回 -1 .
只有超級用戶進程才可以改變實際用戶ID.內(nèi)核對進程存取文件的許可權(quán)的檢查,是通過檢查進程的有效用戶ID來實現(xiàn)的,所以普通用戶可以通過暫時獲得root權(quán)限來操作文件。
4. 實現(xiàn)shell過程中的操作
1)readline函數(shù)庫
??調(diào)用該函數(shù)庫可直接實現(xiàn)命令行方向鍵的使用、光標移動、自動補全、查看命令歷史記錄。
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使用注意事項
??因為用vfork創(chuàng)建的子進程與父進程共享資源,包括堆棧區(qū)等數(shù)據(jù),如果在子進程使用return結(jié)束進程,在進程結(jié)束后系統(tǒng)會回收該進程鎖占用的資源,也就導致父進程在繼續(xù)運行時之前所有資源都已“消失”,會發(fā)生段錯誤,而使用exit退出時,則是直接退出進程,不會進行資源的回收,所以不會出錯。
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: 藍 34: 藍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 光標上移n行
\03[nB 光標下移n行
\033[nC 光標右移n行
\033[nD 光標左移n行
\033[y;xH設(shè)置光標位置
\033[2J 清屏
\033[K 清除從光標到行尾的內(nèi)容
\033[s 保存光標位置
\033[u 恢復光標位置
\033[?25l 隱藏光標
\33[?25h 顯示光標
友情鏈接:
http://blog.csdn.net/yi412/article/details/46867137
http://www.linuxidc.com/Linux/2011-03/32903.htm
總結(jié)
以上是生活随笔為你收集整理的进程控制 (二) Others的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件操作(二) 其他总结
- 下一篇: 线程控制(一)