linux-08-進(jìn)程管理2

今天:進(jìn)程結(jié)束 -fork() /exit退出進(jìn)程/wait()父進(jìn)程等待子進(jìn)程/vfork()Unix/Linux 信號

break是用來退循環(huán)澎蛛,return退函數(shù)氯檐,exit()退進(jìn)程

程序員退出進(jìn)程的方式:

1.正常退出

a.在主函數(shù)中執(zhí)行了return語句(特殊的,因?yàn)橹粚χ骱瘮?shù)有效)

b._exit()或_Exit()函數(shù)退出進(jìn)程(立即退出)

c. exit()退出進(jìn)行(通用方式)

d.最后一個線程結(jié)束

2.非正常退出

a.被信號干掉了寂玲,比如:ctrl+cb.最后一個線程被取消

exit()/_exit()/_Exit()_exit(int) /_EXIT(int)這兩個在底層是一樣的塔插,_Exit()調(diào)用了_exit()

exit()函數(shù)會退出進(jìn)程,但不一定是馬上退出拓哟,允許通過atexit()函數(shù)注冊一些其他的函數(shù)想许,在退出前會先執(zhí)行注冊過的函數(shù)。

_exit()函數(shù)會立即退出,退出只做三件事:

1.關(guān)閉文件描述符

2.讓所有的子進(jìn)程變成孤兒進(jìn)程

3.發(fā)退出信號給父進(jìn)程如果沒有特殊需求流纹,退出進(jìn)程用exit()即可糜烹。

wait()和waitpid()

wait()和waitpid()可以讓父進(jìn)程等待子進(jìn)程的結(jié)束,可以取得子進(jìn)程結(jié)束的方式(正常退出還是非正常退出)和退出碼

wait()必須等待任意一個子進(jìn)程的結(jié)束漱凝,只要有子進(jìn)程結(jié)束疮蹦,那么wait()就返回,如果沒有子進(jìn)程結(jié)束茸炒,父進(jìn)程繼續(xù)等待愕乎。waitpid()可以等待多種方式的子進(jìn)程,也可以一個都不等待壁公,因此更靈活感论。

wait()和waitpid()能回收僵尸子進(jìn)程的資源。

pid_t wait(int* status)

功能:等待任意一個子進(jìn)程的結(jié)束紊册,并取得退出狀態(tài)和退出碼參數(shù):

status是傳出參數(shù)比肄,返回子進(jìn)程的退出狀態(tài)和退出碼返回值:返回結(jié)束子進(jìn)程的PID

宏函數(shù)被用于判斷子進(jìn)程的退出狀態(tài)和獲取退出碼WIFEXITED(status) 判斷是否正常退出WEXITSTATUS(status)獲取退出碼(只有正常退出才有效)

5 int main()

6{

7 pid_t pid = fork();

8 if(pid==0){//子進(jìn)程分支

9 sleep(2);

10 printf("子進(jìn)程%d開始運(yùn)行\(zhòng)n",getpid());

11 sleep(2);

12 printf("子進(jìn)程%d結(jié)束\n",getpid());

13 exit(10);

14 }

15 int status;

16 pid_t wpid= wait(&status);

17 if(WIFEXITED(status))

18 {

19? ? printf("子進(jìn)程%d結(jié)束,退出碼%d\n",wpid,WEXITSTATUS(status));

20 }

21 printf("父進(jìn)程結(jié)束\n");

22

運(yùn)行結(jié)果:

子進(jìn)程14587開始運(yùn)行

子進(jìn)程14587結(jié)束

子進(jìn)程14587結(jié)束湿硝,退出碼10

父進(jìn)程結(jié)束

pid_t waitpid(pid_t pid,int* status,int options)

功能:等待子進(jìn)程的結(jié)束薪前,但比wait()更靈活(可以不等)

第一個參數(shù):pid是等待哪個/哪些子進(jìn)程润努,包括:

-1 等待任意一個子進(jìn)程的結(jié)束

>0 等待特定的一個子進(jìn)程(進(jìn)程ID=pid)

0? 等待和父進(jìn)程一個進(jìn)程組的子進(jìn)程(本組)

<-1等待指定進(jìn)程組的子進(jìn)程(進(jìn)程組ID=|pid|)

第二個參數(shù):status和wait()中的一樣

第三個參數(shù):option可以設(shè)置等待或是不等待关斜,默認(rèn)0為等待,宏WNOHANG可以代表不等待铺浇。

返回:有子進(jìn)程結(jié)束返回結(jié)束子進(jìn)程的PID痢畜,如果不等待并且沒有子進(jìn)程結(jié)束返回0,失敗返回-1鳍侣。

int main()

7 {

8? ? pid_t pid1,pid2;//一父二子需要判斷

9 pid1 = fork();

10

11 if(pid1>0)pid2 = fork();

12? if(pid1==0){//進(jìn)程1

13? sleep(1);

14? printf("子進(jìn)程-%d結(jié)束\n",getpid());

15? exit(20);

16? }

17 if(pid2==0) {

18 sleep(3);

19 printf("子進(jìn)程-%d結(jié)束\n",getpid());

20 exit(20);

21 }

22 int status;

23 pid_t wpid = waitpid(pid1,&status,0);

24 if(WIFEXITED(status))

25 {

26 printf("子線程%d,退出碼%d\n",wpid,WEXITSTATUS(status));

27 }

28 }

vfork() +execl()創(chuàng)建子進(jìn)程

fork()函數(shù)從語法上和fork()沒有任何區(qū)別丁稀,區(qū)別在于fork()不會復(fù)制父進(jìn)程的任何資源。子進(jìn)程會占用父進(jìn)程的資源繼續(xù)運(yùn)行倚聚,而父進(jìn)程會阻塞线衫,停止運(yùn)行。父進(jìn)程的阻塞有兩種方法可以解除

1.子進(jìn)程運(yùn)行結(jié)束惑折,把資源還給父進(jìn)程

2.子進(jìn)程調(diào)用了execl()授账,啟動了一個全新的程序,也把原來的資源還給父進(jìn)程(并行的方式)惨驶。

第二種方法更有意義更常用白热,第一種方法沒有實(shí)際意義。

vfork()會創(chuàng)建一個新的子進(jìn)程粗卜,可以確保子進(jìn)程先運(yùn)行屋确。

vfork()創(chuàng)建的子進(jìn)程必須用exit()退出,return語句退出會有問題。

vford()函數(shù)能創(chuàng)建子進(jìn)程攻臀,但是不能提供代碼和數(shù)據(jù)焕数,execl()函數(shù)不能創(chuàng)建子進(jìn)程,但可以提供進(jìn)程運(yùn)行的代碼和數(shù)據(jù)刨啸。

execl()函數(shù)不會創(chuàng)建新的進(jìn)程百匆,進(jìn)程PID不變,用一個新的程序替換掉當(dāng)前進(jìn)程執(zhí)行的程序呜投。

int execl(char* path,char* cmd,...)

功能:啟動一個全新的程序加匈,當(dāng)前程序?qū)⒈惶鎿Q,但不會建立新進(jìn)程

參數(shù):path就是新程序的路徑仑荐,包括文件名雕拼,不能出錯

cmd就是運(yùn)行程序的命令,比如:a.out

...可以包括命令的參數(shù)/命令的選項(xiàng)粘招,最后以NULL結(jié)束

返回:成功則啟動新程序啥寇,沒有任何返回值

失敗就無法啟動新程序,返回-1

關(guān)于進(jìn)程必須會寫代碼:

fork()

vfork()和execl()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洒扎,一起剝皮案震驚了整個濱河市辑甜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌袍冷,老刑警劉巖磷醋,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異胡诗,居然都是意外死亡邓线,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門煌恢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骇陈,“玉大人,你說我怎么就攤上這事瑰抵∧愦疲” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵二汛,是天一觀的道長婿崭。 經(jīng)常有香客問我,道長习贫,這世上最難降的妖魔是什么逛球? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮苫昌,結(jié)果婚禮上颤绕,老公的妹妹穿的比我還像新娘幸海。我一直安慰自己,他們只是感情好奥务,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布物独。 她就那樣靜靜地躺著,像睡著了一般氯葬。 火紅的嫁衣襯著肌膚如雪挡篓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天帚称,我揣著相機(jī)與錄音官研,去河邊找鬼。 笑死闯睹,一個胖子當(dāng)著我的面吹牛戏羽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播楼吃,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼始花,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了孩锡?” 一聲冷哼從身側(cè)響起酷宵,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎躬窜,沒想到半個月后浇垦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斩披,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年溜族,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垦沉。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仍劈,靈堂內(nèi)的尸體忽然破棺而出厕倍,到底是詐尸還是另有隱情,我是刑警寧澤贩疙,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布讹弯,位于F島的核電站,受9級特大地震影響这溅,放射性物質(zhì)發(fā)生泄漏组民。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一悲靴、第九天 我趴在偏房一處隱蔽的房頂上張望臭胜。 院中可真熱鬧,春花似錦、人聲如沸耸三。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仪壮。三九已至憨颠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間积锅,已是汗流浹背爽彤。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缚陷,地道東北人淫茵。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蹬跃,于是被迫代替她去往敵國和親匙瘪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容