黑馬《linux系統程式設計》學習筆記(從6到10)
阿新 • • 發佈:2018-12-29
六. 程序狀態的切換
七. fork函式
通過fork的返回值,判斷這個程序是父程序還是子程序
因為fork之後,有了2個程序。
如果返回值是0,則這個程序是子程序;
如果返回值大於0.則這個程序是父程序。
八. 程序相關的問題分析
接下來,為了回單問題2,即“子程序建立成功之後,程式碼的執行位置”。 我們寫個fork.c來驗證一下,程式碼如下
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> int main(int argc, const char* argv[]) { pid_t pid = fork(); //這裡的話,如果fork之後,子程序跟父程序一樣執行,那麼下面這個迴圈,總共只會執行一次, //否則的話,子程序如果自己從頭開始,這部分迴圈會被執行兩次。 for(int i=0; i<5; ++i) { printf("------------ i = %d\n", i); } // 父程序 if(pid > 0) { printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid()); // sleep(1); } // 子程序 else if(pid == 0) { printf("child process, pid = %d, ppid = %d\n", getpid(), getppid()); } for(int i=0; i<5; ++i) { printf(" i = %d\n", i); } return 0; }
結論:
有時候會出現,父程序比子程序先結束,導致問題,原因是
九. 關於父子程序log輸出的順序
這個log輸出的順序,不能用來證明,父子程序那個更快,證明先後順序是不行的。
十. 迴圈建立多個子程序
版本1
程式碼
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> int main(int argc, const char* argv[]) { int number =5; pid_t pid = fork(); for(int i=0;i<number;++i) { pid=fork(); } return 0; }
示例結果圖
顯然不合,並非我們初衷,我們並不想要這麼多孫子和重孫。所以我們接下來改一改
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> int counter = 100; int main(int argc, const char* argv[]) { pid_t pid; int i=0; for(i=0; i<3; i++) { pid = fork(); if(pid == 0) { break; } } // 父程序 if(i == 3) { counter += 100; printf("parent process, pid = %d, ppid = %d, %d\n", getpid(), getppid(), counter); // sleep(1); } // 子程序 else if(i == 0) { // 1th counter += 200; printf("child process, pid = %d, ppid = %d, %d\n", getpid(), getppid(), counter); } else if(i == 1) { // 2th counter += 300; printf("child process, pid = %d, ppid = %d, %d\n", getpid(), getppid(), counter); } else if(i == 2) { // 3th counter += 400; printf("child process, pid = %d, ppid = %d, %d\n", getpid(), getppid(), counter); } return 0; }