原創blog,轉載請注明出處
頭文件:
#include<unistd.h>我們來看一個簡單的例子
#include<unistd.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char ** argv )
{
pid_t result = fork();
if(result < 0)
{
printf("Error");
}
else if(result == 0)
{
printf("From the son");
}
else
{
printf("From the father");
}
}
From the son
From the father
再看一個例子
代碼
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char ** argv )
{
int i;
for(i = 0;i < 2;i++)
{
fork();
printf("%d\n",i);
}
}
[root@localhost test]# gcc -o first first.c
[root@localhost test]# ./first
0
1
1
0
1
1
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char ** argv )
{
int i;
for(i = 0;i < 2;i++)
{
fork();
printf("%d PPID:%d PID:%d\n",i,getppid(),getpid());
}
}
結果
[root@localhost test]# ./first先分析PID,一共有4種,所以一共有4984,4985,4986,4987四個進程,所以4424是最開始的進程(main)的父進程,所以,最開始的進程是4984
0 PPID:4984 PID:4985
1 PPID:4985 PID:4986
1 PPID:4984 PID:4985
0 PPID:4424 PID:4984
1 PPID:4984 PID:4987
1 PPID:4424 PID:4984
其中,輸出的順序按照紅色圈中順序來輸出
由圖可以看出,在我的這個CentOS系統中,子進程比父進程先執行,執行順序在不同系統中不一樣,所以編程的時候應當不依賴執行某一個系統的順序。
然后,我們來分析一道經典的筆試面試題
for(i = 0;i < 2;i++)和
{
fork();
printf("%d\n",i);
}
}
for(i = 0;i < 2;i++)
{
fork();
printf("%d",i);
}
}
各輸出了幾個0,幾個1
對於前者
輸出是
0
1
1
0
1
1
輸出是
01010101對於前者,在上面已經進行了圖解,所以不難理解,對於后者,不少同學會很奇怪,為什么輸出了4個0,4個1?
原因是:C語言中,printf函數如果遇到\n,會立即輸出緩沖區內所有內容,如果沒有\n,會先輸出到緩沖區內,等待輸出
我們繼續畫圖來分析,
這里在詳細解釋下:可以這么理解,每次printf的時候,是把本進程的printf緩沖區,加入到總的printf緩沖區(這種說法可能不嚴謹),比如到紅色圈圈3的時候,4985本身在紅色圈圈1的時候緩沖區已經有0了,那么再加入1,則本身進程的緩沖區為01,那么加入到printf總的緩沖區就是0101
原創blog,轉載請注明出處
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。