最近在使用fork函數時,遇到了一些問題,最後通過實驗,終於明白了fork的用法,現在分享一下我的
一些體會。
那麼,首先看一段代碼(fork.c):
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main ()
{
pid_t pid;
int count = 0;
pid = fork ();
if (pid != 0) {
printf ("我是孩兒他爹/n/n");
count += 1;
}
else {
printf ("我是我爹的兒子/n/n");
count += 1;
}
printf("統計結果是:%d/n", count);
return 0;
}
編譯-- gcc fork.c -o fork
運行,結果如下:
我是我爹的兒子
統計結果是:1
我是孩兒他爹
統計結果是:1
從中我們可以看出,在執行了fork函數後,子進程首先執行,然後是父進程,同時通過計數器可以看出,
兩個進程不共享內存區域(不共享count這個變量),形成了兩個相對獨立的進程。
那麼,再來看下一個問題,代碼如下:
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <unistd.h>
- int main ()
- {
- int i;
- for (i = 0; i < 1; i++) {
- fork ();
- printf ("+ ");
- }
- return 0;
- }
這是一個for循環,很簡單,每次打印一個“+”號,首先,賦值1給i,運行,結果爲:
+ +
賦值2給i,運行,結果爲:
+ + + + + +
...
通過統計,可以得出結論:
“+”號的總數爲 = 2 * (0 + 1 + 2 ...)
可見,一次循環,產生兩個進程,第二次是加倍,第三次再加倍...
可見fork能爲我們源源不斷的增加"人口“,再配合着exec家族,就能讓linux的進程人丁興旺了,當然,產生
新進程的方法還有system,但出於安全的考慮,fork和exec要好一些。