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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jq执行2次同样的方法怎么让第一次执行的不触发_他们说,这段代码你能看得懂她的开始,却猜不中她的结尾。...

發布時間:2025/6/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jq执行2次同样的方法怎么让第一次执行的不触发_他们说,这段代码你能看得懂她的开始,却猜不中她的结尾。... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看下小姐姐,舒緩下心情先。


好,現在回到我們的主題,看下下面這段代碼,你覺得它會輸出幾個#號呢?

這個問題來自于我們技術群里的一位同學的提問,為了給大家一個思考時間,我們先不說結果,先再看下另一位可愛的小妹妹。


啊,好可愛啊,為啥我選擇了技術,而沒去學畫畫!


好,不知道你想得怎么樣了呢?

我們先來執行下,看下其具體輸出。

看到沒,8個,不知道你有沒有猜對呢?

可為什么是8個呢,你要說2個我能理解,3個我也能理解,為什么偏偏是這么夸張的8個?

其實這道題目主要考察兩個點,第一個點就是fork的作用,如果你不理解fork,那你肯定認為輸出的個數就是2個。

fork的作用其實就是拷貝當前進程,然后創建一個原樣的子進程,子進程開始時執行的代碼,就是父進程調用fork之后的代碼。

對于我們上面的題目來說,子進程就是進入了下一次for循環。

詳細的fork文檔可以參考下面的鏈接:

https://man7.org/linux/man-pages/man2/fork.2.html

因為fork函數創建子進程,進而也會有#號輸出,把這個考慮在內的話應該是3個#號,因為主進程會輸出2個,主進程第一次for循環創建的子進程,在其進入到下一次循環時又會輸出一個。

其他的因為主進程,或者是該子進程調用fork方法,創建的進一步的子進程再進入到for循環時,因為不滿足 i < 2,會直接跳出循環,也就是說不會再輸出#號。

那這樣說也應該是3個#號啊,為什么是8個呢?

這里就涉及到了第二個知識點,printf。

為了減少系統調用次數,提高程序性能,我們每次調用printf時,并不會立即觸發一次系統調用,而是會先寫到printf的buffer區,如果buffer區滿了,或者說寫入字符中有\n換行符,才會真正的觸發一次系統調用,將我們buffer中的printf的內容輸出到控制臺。

這也是有時我們寫程序時,經常會發現明明調用了輸出方法,但控制臺上就是沒有輸出的一個常見原因。

好,再次回到我們的題目。

由上圖我們可以看到,我們在for循環里調用的printf,都是沒有加上\n換行符的,我們只有在進程結束前的printf才加上,也就是說,for循環里的printf,只是把我們的內容放到了它的buffer中,并沒有真正輸出。

那有意思的事就來了。

當我們后面再調用fork時,fork可是拷貝當前進程的全部內存的,這可是包括printf的buffer區的,舉例來說,當我們主進程執行第二次for循環,調用fork時,此時的printf的buffer里已經有兩個#號了,此時fork一個子進程,子進程中的相應buffer區里也會有這兩個#號。

當主進程或子進程退出之前,遇到最后一個帶有\n換行符的printf時,就會把buffer中現有的那兩個#號輸出出來,即每一個進程都會因為同樣的原因,最終輸出2個#號。

再看下我們的代碼,算上主進程,一共創建了4個進程,那最終輸出的可不就是8個#號嘛。

小知識,大學問!

不知道你有沒有猜中這樣的結尾呢?


寫文章不易,如果可以的話,歡迎大家轉發或給個在看,沒關注的也可以關注下,希望以后能給大家帶來更多的驚艷文章。

總結

以上是生活随笔為你收集整理的jq执行2次同样的方法怎么让第一次执行的不触发_他们说,这段代码你能看得懂她的开始,却猜不中她的结尾。...的全部內容,希望文章能夠幫你解決所遇到的問題。

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