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次同样的方法怎么让第一次执行的不触发_他们说,这段代码你能看得懂她的开始,却猜不中她的结尾。...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jquery 替换括号里面内容_EXCE
- 下一篇: string 换行符_Java 11 已