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