Linux下创建进程简介
在博文https://blog.csdn.net/fengbingchun/article/details/108940548中簡單介紹了Windows下通過函數CreateProcess創建進程的過程,這里簡單介紹下Linux下通過fork函數創建進程的過程。很早之前在https://blog.csdn.net/fengbingchun/article/details/45690745中也曾介紹過。
進程創建的UNIX模型為分叉----執行(fork----exec)模型。fork函數調用生成一個完全復制父進程內存的子進程。exec函數調用以一個新的可執行文件替換當前進程。這兩個調用通常一起使用,這樣應用程序可調用fork函數創建一個新進程,然后該子進程直接調用exec函數以一個新的可執行文件替換自身。如果fork調用后面不跟exec調用,我們將有同一進程的兩個副本。到進行分叉調用時這兩個進程的進程狀態是一樣的。
子進程和父進程都會從fork函數調用返回,唯一的區別在于調用的返回值。子進程將返回零值,父進程將返回子進程的進程ID。fork函數不帶任何參數,并返回一個整數值,返回負值,表示創建子進程失敗。子進程和父進程在單獨的內存空間中運行。子進程具有自己唯一的進程ID。子進程不會繼承其父進程的內存鎖。調用一次fork,卻能夠返回兩次返回值,在子進程中,fork函數返回0,在父進程中,fork函數返回新創建子進程的進程ID。我們可以通過fork返回值來判斷當前進程是子進程還是父進程。兩個進程執行沒有固定的先后順序,哪個進程先執行要看系統的進程調動策略。一個進程通過調用wait來與它的子進程同步。
以下是測試代碼段:
void test_fork_1()
{// reference: https://www.geeksforgeeks.org/fork-system-call/fork();fork();fork();// "hello"的打印次數等于創建的進程數,進程總數為2^n,其中n是fork調用的數目fprintf(stdout, "hello\n"); // 注:總共會輸出8次hello
}
test_fork_1():總共會輸出8次”hello”。”hello”的打印次數等于創建的進程數,進程總數為2^n,其中n是fork調用的數目。8次”hello”=1個主進程+7個子進程。執行結果如下圖所示:
void test_fork_2()
{// reference: https://www.geeksforgeeks.org/fork-system-call/pid_t f = fork();// child process because return value zeroif (f == 0) {fprintf(stdout, "hello from child: parent pid: %d, my(child) pid: %d\n", getppid(), getpid());}// parent process because return value non-zeroelse if (f > 0) {fprintf(stdout, "hello from parent: my(parent) pid: %d\n", getpid());} else {fprintf(stderr, "unable to create child process\n");}
}
test_fork_2():”hello from child”和”hello from parent”兩個輸出是可能的,因為父進程和子進程同時運行。因此,我們不知道操作系統是先將控制權交給父進程還是子進程。父進程和子進程正在運行同一程序,但這并不意味著它們是相同的。操作系統為這兩個進程分配不同的數據和狀態,并且這些進程的控制流可以不同。執行結果如下圖所示:
GitHub:https://github.com/fengbingchun/Messy_Test
總結
以上是生活随笔為你收集整理的Linux下创建进程简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows下创建进程简介
- 下一篇: 软件调试的艺术笔记:GDB