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

歡迎訪問 生活随笔!

生活随笔

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

linux

linux学习笔记 (fork FILE PC)

發布時間:2025/3/20 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

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