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