您好,登錄后才能下訂單哦!
一 進程概念
1.進程產生
操作運行了一個程序,至少會產生一個進程
2.Linux 創建進程
struct task_struct
{
進程號 (PID)
父進程號 (PPID)
運行地址空間
一組寄存器值
進程狀態
....
};
問題:進程與程序的區別?
回答:程序就是一個編譯好的可執行文件,而進程是操作系統為了執行一個程序而創建的,進程是程序的一次執行過程
二 進程相關的命令
1.ps -ef
查看進程的PID和PPID
2.ps aux
查看進程狀態 R:運行態 S:可中斷的等待態 D:不能中斷的等待態 T:停止態 Z:僵尸態(PID資源未釋放)
3.kill
<1>kill -l 查看系統中信號
<2>發送信號到指定的進程
kill -信號 PID
例如:
kill -SIGSTOP 5207
4.killall
給同名的進程發信號
killall -信號 進程名
5.查看系統允許的最大進程個數
cat /proc/sys/kernel/pid_max -> 32768
三 創建子進程
pid_t fork(void);
功能:創建子進程
返回值:
成功給父進程返回子進程的PID,給子進程返回0,失敗返回-1
思考:如何創建子進程?
回答:復制父進程
僵尸進程:進程結束,但是父進程沒有對它進行收尸處理
孤兒進程:父親進程結束,子進程就會變成孤兒進程,孤兒進程會自動被init進程收養
問題:為什么創建子進程?
回答:創建子進程的目的是讓子進程執行獨立任務
問題:子進程和父進程會不會相互影響
回答:不會,父子進程的地址空間是獨立
練習:
創建兩個子進程,子進程1輸出"hello word"然后結束,
子進程2 進行while(1) , 父進程進行while(1)
四 父進程回收僵尸態子進程
pid_t wait(int *status);
功能:等待僵尸態子進程
參數:
@status 獲取僵尸態子進程狀態
返回值:
成功返回僵尸態子進程PID,失敗返回-1(沒有子進程)
常用用法: wait(NULL);
pid_t waitpid(pid_t pid, int *status, int options);
參數:
@pid -1:等待任意一個子進程退出 子進程的PID:等待指定PID子進程
@status 獲取子進程退出的狀態
@options 0:阻塞的方式調用 WNOHANG:非阻塞方式調用
返回值:
成功返回僵尸態子進程PID,失敗返回-1, 如果沒有子進程處于僵尸態,且非阻塞方式調用,此時立即返回,返回值為0
waitpid(-1,NULL,0); => wait(NULL);
waitpid(pid,NULL,0);
waitpid(-1,NULL,WNOHANG);//常用的用法
waitpid(pid,NULL,WNOHANG);
五 結束一個進程
return : 在main函數使用return,用來結束進程
_exit() : 用來結束一個進程
exit() : 用來結束一個進程,刷新緩存
exit(EXIT_SUCCESS) 成功
exit(EXIT_FAILURE) 失敗
例如:
fd = open(...);
if(fd < 0){
fprintf(stderr,"...");
exit(EXIT_FAILURE);
}
六 在一個進程中運行另外一個程序(啟動另外一個進程)
exec 函數族:
在一個進程中執行一個程序,替換原進程所有資源(代碼段,數據段, ...),只保留原進程的PID
bash執行程序的流程:
bash ---> < fork --->子進程 >---->調用exec函數族---->執行我們的可執行程序
int execl(const char *path, const char *arg, ...);
l : list
int execl(可執行文件路徑,可執行文件名,傳遞參數1,傳遞參數2,...,NULL);
例如:
執行/bin/ls ,傳遞的參數是-l
execl("/bin/ls","ls","-l",NULL);
p : path
int execlp(const char *file, const char *arg, ...);
例如:
執行/bin/ls ,傳遞的參數是-l
execlp("ls","ls","-l",NULL);
v:vetcor (參數存放在指針數組中)
int execv(const char *path, char *const argv[]);
例如:
執行/bin/ls ,傳遞的參數是-l
char *arg[] = {"ls","-l",NULL};
execv("/bin/ls",arg);
int execvp(const char *file, char *const argv[]);
int execle(const char *path, const char *arg, ..., char * const envp[]);
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。