linux学习笔记 (fork FILE PC)
一、
下面的代碼是對fork的測試
運行結果為:
可以看出,所有進程的pid 為 10604 ~ 10611? (共 8 個?? 2 ^ 3)
?
修改循環條件,讓循環執行5次,
所有進程的pid 為 : 10637 ~ 10668 (共 32 個? 2 ^ 5)
?
可以看出,循環執行n次,進程的數目為: 2 ^ n 個
?而printf的次數則要加上先前的進程數目,
?
這可以類比于滿二叉樹,
進程的數目相當于當前層的結點數目之和,而printf的次數相當于當前結點及之前的所有節點的數目之和
二、
FILE結構體:
首先定位:
cd?/usr/include搜索:
gerp?'FILE'?stdio.h?
搜索出了一大堆,但其中有一行代碼:
?typedef?struct?_IO_FILE?FILE;所以接下來搜索 _IO_FILE:
??grep?'_IO_FILE'?*.h搜索出了幾行,其中有一行:
???libio.h:struct?_IO_FILE這說明我們要找的_IO_FILE 是在 libio.h
所以接下來打開libio.h
?vim?libio.h然后,在底欄模式下搜_IO_FILE
:/_IO_FILE多搜幾次,直到搜索到定義。
搜到的定義如下:
?
三、
先看下面這段代碼:
當注釋的那段 sleep(5)存在時,
父進程要比子進程結束地晚,這時,輸出的結果為:
這符合我們的預期
?
然而,如果想我圖片中那樣注釋掉 sleep(5) 這一行代碼,
父進程會先于子進程結束。
?
對于子進程來說,它正在執行,突然它的父進程結束了,
這時候,該子進程就叫做“孤兒進程”,
它的父進程變為 init(1號進程)
?
?
四、
(這部分內容參考:http://www.kuqin.com/shuoit/20141122/343361.html)
將上面的代碼改一下,把fork更改為vfork
修改后的代碼如下圖:
實際上,vfork()創建的子進程 跟父進程除了共享代碼以外,還共享數據
也就是說,fork() 是 寫時拷貝,而vfork()是共享
這時候,一旦子進程開始執行的時候,父進程將被阻塞,直到子進程 正常結束 異常結束或exec,父進程才繼續執行。
因此,vfork()可以保證子進程始終要先于父進程結束。
?
在上圖的代碼中,當子進程的那部分代碼用 exec的方式結束時,程序能夠正常執行,分別輸出 子進程和父進程的pid
但如果用return 0 的方式結束,執行程序,會發現程序進入了如下圖的類似死循環的狀態,掛掉:
這是由于:????
????對于子進程,它執行exit(),操作系統會結束該進程,并讓父進程繼續工作;
?
????而子進程一旦執行return 0,由于其數據與父進程完全共享,return 0 的作用也發生在父進程上,這時父進程的棧幀會被改變,這時發生的事情是未知的,在某些內核版本中,程序會報“棧錯誤”,而另一些內核版本中,程序會再次進入main函數開始執行,就造成了死循環。
?
轉載于:https://blog.51cto.com/zhweizhi/1791053
總結
以上是生活随笔為你收集整理的linux学习笔记 (fork FILE PC)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运维常见统计表模板(word版)
- 下一篇: jQuery手机菜单