日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux 进程控制 :进程创建,进程终止,进程等待,程序替换

發布時間:2024/4/11 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 进程控制 :进程创建,进程终止,进程等待,程序替换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 進程創建
  • 進程終止
  • 進程等待
  • 程序替換

進程創建

fork函數

創建一個子進程,父子進程代碼共享,數據獨有

#include <unistd.h>
pid_t fork(void);
返回值:自進程中返回0,父進程返回子進程id.出錯返回1。

當調用fork函數時,通過使用寫時拷貝技術來拷貝父進程的信息。

寫時拷貝技術:子進程通過復制父進程的pcb,使得復制進程指向同一塊物理內存,同時運行位置,和代碼相同。但又因為進程之間需要獨立性,所以當某一個進程數據發生改變的時候會重新給子進程開辟物理內存,將數據拷貝過去。(之所以這樣使用是因為如果數據不修改的話還開辟空間拷貝數據會使效率降低)

這也就是數據獨有的原因。
代碼共享:通過頁表來實現訪問控制,使代碼段是只讀的,不可修改。

vfork函數

創建一個子進程,并且阻塞父進程,直到子進程退出或者程序替換,父進程才繼續運行。

#include <unistd.h>
pid_t vfork(void);
返回值:自進程中返回0,父進程返回子進程id.出錯返回1。

vfork創建子進程的效率比fork要高,因為vfork所創建的子進程和父進程共用同一個虛擬地址空間。

但也因為這樣,進程之間就不具備獨立性,父子進程不能同時訪問代碼段和數據段,所以當子進程運行的時候必須要阻塞父進程,防止產生沖突。

雖然vfork效率高,但是fork因為實現了寫時拷貝技術,效率提高了不少,所以vfork已經很少使用了。


進程終止

在linux下有三種終止進程的方法。

return:

只能在main函數中使用,退出后刷新緩沖區

exit:

庫函數調用接口

#include <unistd.h>
void exit(int status);
退出刷新緩沖區

_exit:

系統函數調用接口

#include <unistd.h>
void _exit(int status);
參數:status 定義了進程的終止狀態,父進程通過wait來獲取該值
退出不刷新緩沖區


進程等待

之前講過,如果子進程退出時沒有給父進程返回退出的信息,父進程就會以為他并沒有退出,所以一直不釋放他的資源,使子進程進入僵尸狀態。
之前的解決方法是退出父進程,但是那個不是一個合理的解決方法,這里有更好的方法,就是進程等待。

wait

阻塞等待任意一個進程退出,獲取退出子進程的pid,并且釋放子進程資源。

#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int*status);
返回值:
成功返回被等待進程pid,失敗返回-1。
參數:
輸出型參數,獲取子進程退出狀態,不關心則可以設置為NULL

阻塞:為了完成某個功能發起調用,如果不具備完成功能的條件,則調用不返回一直等待。
非阻塞:為了完成某個功能發起調用,如果不具備完成功能的條件,則立即報錯返回

waitpid

可以指定等待一個子進程的退出

#include<sys/wait.h>
pid_ t waitpid(pid_t pid, int *status, int options);
返回值:
當正常返回的時候waitpid返回收集到的子進程的進程ID;
如果設置了選項WNOHANG,而調用中waitpid發現沒有已退出的子進程可收集,則返回0;
如果調用中出錯,則返回-1,這時errno會被設置成相應的值以指示錯誤所在;
參數:
pid:
Pid=-1,等待任一個子進程。與wait等效。
Pid>0.等待其進程ID與pid相等的子進程。
status:
WIFEXITED(status): 若為正常終止子進程返回的狀態,則為真。(查看進程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED非零,提取子進程退出碼。(查看進程的退出碼)
options:
WNOHANG: 若pid指定的子進程沒有結束,則waitpid()函數返回0,不予以等待。若正常結束,則返回該子進程的ID。


程序替換

創建子進程必定是想讓子進程做與父進程不一樣的事情,如果采用判斷pid的方法來進行代碼分流,這樣的程序會非常龐大,所以還有更好的方法,就是程序替換。

程序替換

替換一個進程正在調度的程序信息(加載另一個程序到內存中,讓PCB不在調度原來的程序,調度這個新的程序。只是改變了映射關系,所以原本的PCB和程序還在 )

exec

#include <unistd.h>`
int execl(const char *path, const char *arg, …);
int execlp(const char *file, const char *arg, …);
int execle(const char *path, const char *arg, …,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

乍一看這么多接口很不容易記,其實是有規律的。

l(list) : 表示參數采用列表
v(vector) : 參數用數組
p(path) : 有p自動搜索環境變量PATH
e(env) : 有e表示自己維護環境變量

總結

以上是生活随笔為你收集整理的Linux 进程控制 :进程创建,进程终止,进程等待,程序替换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。