fork創建多個子進程

references:
[1] how to create two processes from a single Parent
[2] fork() in C
[3] linux中fork同時創建多個子進程的方法

fork的本質,就是復制,把當前進程復制一份,然后兩個進程并發地執行fork后面的語句,區別就是,子進程的fork返回值是0,父進程的fork返回值是子進程的pid,這也是區分父進程和子進程的方法,至于其他的內容,在fork之前的東西兩個進程的一樣的。

給出一個父進程和一個子進程的模板

int fd = fork();
if(fd < 0){exit(1);
} else if(fd == 0){// child code
} else {// father code
}

對于創建1個父進程和2個子進程,也是一樣的道理

int fd1,fd2;fd1 = fork();
if(fd < 0){exit(1);
} else if(fd == 0){// child1 code
} else {fd2 = fork();if(fd2 < 0){exit(1);} else if(fd2 == 0){// child2 code} else {// father code}
}

先創建子進程1,然后父進程再繼續執行,創建子進程2,最后,3個進程能夠在框架內執行自己的代碼。

這是最好用的框架,能夠將3個進程都識別和區分開,不過如果創建n個子進程就會很麻煩。

因此,根據不同需求,也可以有別的寫法

for(int i = 0; i < n; i++){int fd = fork();if(fd < 0){exit(1);} else if(fd == 0){// child i codebreak;} else {// father code}
}

最大作用的是break,保證子進程不會再進一步創建子進程。

然后其實子進程就可以干自己的事情了,比如執行個exec family,執行其他進程什么的。

另外值得一說的是,如果父進程沒有等待子進程結束之后再結束的話,shell就會出現顯示錯亂。

就像下面這樣,但是僅僅是顯示錯亂而已,你可以直接正常輸入命令的。
在這里插入圖片描述

reference
[1] Using fork() in simplest form need to hit enter to finish execution
[2] Why do shells call fork()?

至于為什么,那是因為,當shell執行命令的之后,也會先創建一個子shell,然后執行exec,再執行你想要執行的命令,執行結束后,再返回當前的shell。

我們用shell執行了父進程,結束后返回,就顯示ss@ss:$了,而子進程仍然在執行,并且向shell輸出了child process,所以就造成了上面的局面,但是僅僅是顯示問題而已,正常向shell輸入命令就好。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384599.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384599.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384599.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

wait系統調用

reference:Wait System Call in C 只強調幾點&#xff0c;剩下的直接看參考鏈接內容就好了&#xff0c;不是偷懶&#xff0c;而是里面內容寫的很好了&#xff0c;沒必要再寫一遍了&#xff0c;這種東西就是單純的系統調用而已&#xff0c;理解了功能&#xff0c;就完事了&#…

Linux進程間通信:共享內存與管道

references: [1] IPC through shared memory [2] Inter Process Communication (IPC) [3] https://www.geeksforgeeks.org/pipe-system-call/ [4] watch command in Linux with Examples 參考鏈接1和2是介紹了共享內存IPC的簡單原理和相關系統調用的使用參考鏈接3是介紹了管道通…

find command基本使用

find命令通常用于根據文件名查找文件&#xff0c;這是最基本用法。 find [path] -name/-iname [filename] path寫要查找的路徑&#xff0c;自動遞歸查找filename寫文件名&#xff0c;可以使用通配符*還有其他什么的表達式 具體細節請man find查閱文檔。

正則表達式特別需要注意的點:“空“字符的匹配

在正則表達式中&#xff0c;[...]代表1個字符&#xff0c;不管里面有多少字符&#xff0c;最終這個東西的結果都是1個字符。 對于表達式[^a]表達的匹配除了a之外的字符&#xff0c;并且是1個字符。 需要注意的是&#xff0c;有些特殊字符是不會被匹配的。 我們看一個示例&am…

vim多列操作--插入/刪除

插入 How to insert text at beginning of a multi-line selection in vi/VimVim Commands 刪除 ctrl v使用上下左右鍵選中一片區域按d刪除

vim進行行內某部分的復制剪切粘貼

ctrl v使用方向鍵選中你要復制的部分 按d&#xff08;剪切&#xff09;或者按y&#xff08;復制&#xff09;再移動到你的目標位置&#xff0c;按p粘貼&#xff08;在正常模式下才行&#xff0c;如果不是&#xff0c;先按esc&#xff09; 這個過程與你操作word文檔的復制粘貼…

函數調用堆棧

基于孟寧老師的Linux內核分析 1 int g(int x){ 2 int y x 3;3 return y;4 }5 6 int f(int x){7 int z x 10;8 return g(z);9 }10 11 int main(){12 int a f(8) 1;13 return 0;14…

gdb調試的幾點提示(1)

GDB debugger Examining Memory Continuing and Stepping How to translate a virtual memory address to a physical address? s和n是C語言的下一步 si和ni是匯編語言下一步 gdb能夠查看的都是虛擬地址&#xff0c;不能查看物理地址&#xff0c;應用程序都不能查看物理地址…

C語言讀取文件

C語言一次性讀取文件 C - File I/O C library function - fread() 需要注意的點 fgets函數&#xff0c;一次只能讀取一行&#xff0c;并且在結尾自動添加\0fread函數&#xff0c;可以讀取很多內容&#xff0c;但是不會添加\0需要手動完成&#xff0c;具體看[參考1]

Vivado提高綜合和實現的速度

讓計算機的資源盡可能給vivado&#xff0c;綜合、實現的時候修改一個參數 jobs改為你的計算機的最大值&#xff0c;我的計算機是12核的。 速度會快很多&#xff01;

安裝Ubuntu RISC V toolchain失敗(網速、git配置原因)

git獲取大容量工程出錯&#xff1a;RPC failed&#xff1b; curl GnuTLS recv error : Decryption has failed. error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function.fatal: The remote end 官方GitHub倉庫 gitee鏡像倉庫 如果網速不夠&#xff0…

Linux環境變量 set env export區別

參考鏈接 How to Set Environment Variables in Linux set 他能夠顯示當前shell的環境變量 它針對的對象是當前shell&#xff0c;如果關閉了就沒了&#xff01; 直接使用set --help查看就可以。 env 顯示當前用戶的環境變量&#xff0c;針對的當前登錄的用戶 export 它能…

VirtualBox Ubuntu個人配置

注意這里VT-x啟用&#xff0c;除了在BIOS啟用CPU虛擬化&#xff0c;還得在命令行設置一次才可以勾選。 F:\>cd F:\VirtualBox # 進入VirtualBox安裝目錄F:\VirtualBox>VBoxManage.exe list vms # 查找所有虛擬機 "rhel64" {240f96d8-6535-431d-892e-b70f3dc4…

Ubuntu停止維護版本的軟件源配置和系統升級方法

這里以Ubuntu 20.10版本為例&#xff08;當前是2022.2.14&#xff0c;該版本已經停止維護&#xff09;&#xff0c;我們現在需要正常使用該版本&#xff0c;并且期待升級到21.10版本&#xff0c;我們需要 配置正確是軟件源升級該版本 配置正確的軟件源 配置國內鏡像源 我們…

優質學習內容(自用)

Verilog Verilog教程HDLBits — Verilog Practice中科大Verilog OJVerilog語法和典型電路verilog中if與case語句不完整產生鎖存器的問題 Chisel chisel offcial website playground OpenXiangShan Chisel playgroundchisel IntelliJ IDEA playground library Maven libr…

diff and colordiff on Ubuntu

在Ubuntu中使用diff來對比文件差異&#xff0c;但是不是很好用&#xff0c;尤其是著色方面&#xff0c;用起來很麻煩&#xff0c;因此可以安裝colordiff。 我們有兩個文件file1和file2&#xff0c;使用命令 colordiff file1 file2 -y -B -W 140就可以對比文件差異&#xff0c…

基于IntelliJ IDEA和Ubuntu的Chisel開發環境搭建

注意&#xff01;本教程不是詳細解說&#xff01;只說思路&#xff0c;其余請自己查閱&#xff01;不適合小白用戶。 環境 Ubuntu 20.04 LTSIntelliJ IDEA 過程 在Ubuntu下安裝IDEA&#xff0c;具體版本號的使用&#xff0c;請自行查閱官網安裝IDEA插件&#xff0c;EasySoc…

verilator編譯 更新文件的規則

本文請讀者【直接關閉】&#xff0c;我后面的實踐結果似乎和本文的實踐結果不一樣&#xff0c;真是見鬼了&#xff01;我不知道發生了什么&#xff0c;還沒有來得及進一步校驗&#xff01; 在其他文件不變的前提下&#xff0c;如果即將生成的mk文件和已有的mk文件不一樣&#…

幫助你成為高手的視頻和資料

1. 為什么大多數人不會真正成功 博客鏈接 視頻鏈接 2. TED演講&#xff1a;真正拉開你與周圍人之家差距的&#xff0c;是自學能力 視頻鏈接 3 埃隆馬斯克&#xff1a;第一性原理&#xff0c;少用類比&#xff0c;類比多了就不能抓住本質了 4 如何成為一個頂尖高手 文章鏈…

核心思想

程序員是能夠改變世界的&#xff0c;至少是改變自己的世界。 對于重復的工作&#xff0c;你可以寫一個shell腳本讓他自動化執行&#xff1b; 對于麻煩的工作&#xff0c;你可以看看有沒有相關的插件讓它操作起來更簡化&#xff0c;實在不行你自己造一個&#xff1b; 程序員必…