210120 阶段三 fork与阻塞函数
目錄
- 一、學(xué)習(xí)的知識點
- fork函數(shù)
- 變量的變化
- 文件描述符的變化
- 1.1僵尸狀態(tài)
- 1.2孤兒
- 1.3如何避免僵尸進程
- 1.3.1 wait
- 1.3.2 waitpid
- 2 execlp
- 守護進程
- 二、上課沒有聽懂或者沒有理解的地方
- 三、當(dāng)天學(xué)習(xí)的收獲
一、學(xué)習(xí)的知識點
fork函數(shù)
fork函數(shù)產(chǎn)生兩個進程,一個是主進程,也就是父進程,另一個是子進程。有兩個返回值,一個返回值大于0,表示父進程,值為子進程的pid。一個返回值等于0,表示子進程。
變量的變化
fork以后,子進程對父進程 RW段(已初始化) BSS段(未初始化)的數(shù)據(jù)遵循寫時拷貝,有改動時才執(zhí)行拷貝,而RO段的數(shù)據(jù)是共用的
文件描述符的變化
fork前open的文件,fork后的子進程后父進程都有相同的文件描述符,但fork后open的文件只有執(zhí)行open的進程才有對應(yīng)的文件描述符。我的理解是文件描述符可以繼承但不是共享的。
1.1僵尸狀態(tài)
一個子進程結(jié)束運行時,父進程還存在
1.2孤兒
父進程先于子進程結(jié)束
1.3如何避免僵尸進程
1.3.1 wait
pid_t wait(int *status);
wait函數(shù)用于使父進程阻塞,只能讓父進程等待子進程,不能使子進程等待父進程。
wait的返回值,如果等待成功 返回等待的pid號,出錯則返回-1。
status參數(shù) 用來保存被收集進程退出時的一些狀態(tài),它是一個指向int類型的指針。但如果我們對這個子進程是如何死掉的毫不在意,只想把這個僵尸進程消滅掉,(事實上絕大多數(shù)情況下,我們都會這樣想),我們就可以設(shè)定這個參數(shù)為NULL,就象下面這樣:pid = wait(NULL);
wait函數(shù)特點
1.3.2 waitpid
pid_t waitpid(pid_t pid, int * status, int options) ; 等待某個指定的子進程。等待進程ID為pid的進程
- pid == -1 等待任一子進程。于是在這一功能方面waitpid與wait等效。
- pid > 0 等待其進程I D與p i d相等的子進程。
- pid == 0 等待其組I D等于調(diào)用進程的組I D的任一子進程。
- pid < -1 等待其組I D等于p i d的絕對值的任一子進程。
2 execlp
在子進程里調(diào)用另外一個程序
execl系列函數(shù)的作用就是可以在你創(chuàng)建的子進程中調(diào)用其他人寫好的可執(zhí)行程序
execlp是替換進程映像 相關(guān)函數(shù)只要調(diào)用,后面的代碼都不會執(zhí)行 +p會導(dǎo)入系統(tǒng)的環(huán)境變量
execlp(“l(fā)s”, “l(fā)s -l”, NULL);
execlp(“ps”,“ps”,"-ax",0);
守護進程
概念:程序一旦啟動就會轉(zhuǎn)入后臺,不會因為關(guān)閉終端而結(jié)束進程
- 最重要的特性是后臺運行
- 如果你要脫離終端運行,首先要創(chuàng)建一個新的會話 創(chuàng)建會話函數(shù) setsid();
- 默認(rèn)情況下 父進程不能創(chuàng)建會話
- 創(chuàng)建的守護進程不要使用 printf、cout等輸出函數(shù)。因為脫離終端 而字符輸出依賴于終端 所以輸出了也看不見
- 在Linux中 輸入輸出都有設(shè)備 他有專門的文件描述符 0 1 2錯誤輸出
- 所以創(chuàng)建完守護進程后 也要分別關(guān)閉 close(0) close(1) close(2)
- 在默認(rèn)程序后
- 一個終端可以運行很多進程 多個進程會組成會話 session 會話有權(quán)利創(chuàng)建終端
- 一個進程可以產(chǎn)生子進程,產(chǎn)生多個子進程 為進程組 默認(rèn)情況下父進程就是進程組組長
二、上課沒有聽懂或者沒有理解的地方
無
三、當(dāng)天學(xué)習(xí)的收獲
避免僵尸進程
總結(jié)
以上是生活随笔為你收集整理的210120 阶段三 fork与阻塞函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux umask 文件默认权限
- 下一篇: 210122阶段三进程间信号