溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux系統(tǒng)編程總結(jié)(1)

發(fā)布時間:2020-07-07 18:08:07 來源:網(wǎng)絡(luò) 閱讀:3050 作者:baiweibi 欄目:編程語言

一 進程概念

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[]);
 


向AI問一下細節(jié)

免責(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)容。

AI