fork函數學習:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
main ()
{
pid_t pid; pid=fork();
if (pid < 0)
printf("error in fork!");
else if (pid == 0)
printf("i am the child process, my process id is %dn",getpid());
else
printf("i am the parent process, my process id is %dn",getpid());
}
這段代碼寫了一個使用fork函數建立子進程,父子進程同時運行而產生交錯的,不一樣的運行結果。運行結果如下:
# ./a.out
i am the child process, my process id is 4286
i am the parent process, my process id is 4285
fork在英文中是叉子,分叉的意思,在函數fork中,取後面的意思。很形象的表示程式從這裡分叉,fork函數建立了子進程,子進程和父進程同時(其實是cpu分時處理)開始運行分叉之後的程式。
程式改寫下:
main()
{
pid_t pid;
printf("/n[%d]not fork pid=%d/n",getpid(),pid);
pid=fork();
printf("/n[%d]forked pid=%d/n",getpid(),pid);
if(pid<0)
{
printf("error in fork!/n");
getchar();
exit(1);
}
else if(pid==0)
printf("/n[%d]in child process,p_id=%d/n",getpid(),getpid());
else
{
printf("/n[%d]in parent process,my pid=%d/n",getpid(),pid);
printf("/n[%d]in parent process,my getpid=%d/n",getpid(),getpid());
}
}
程式運行結果如下:
$ ./fork
[3819]not fork
[3820]forked pid=0
[3820]in child process,p_id=3820
[3819]forked pid=3820
[3819]in parent process,my pid=3820
[3819]in parent process,my getpid=3819
可以清楚的看到 not fork只列印了一次,其中[3819]是父進程的進程號,建立fork以後,fork函數返回給父進程的值pid是子進程的進程號[3820],而在子進程中,pid值為零。也就是說子進程中,pid被置零。 引用網上一位網友的解釋“其實就相當於鏈表,進程形成了鏈表,父進程pid(p 意味point)指向子進程的進程id, 因為子進程沒有子進程,所以其pid為0. ”
一個很有意思的程式:
int main()
{
int i;
for( i= 0; i< 3; i++)
{
int pid= fork();
if(pid== 0)
{
printf("son/n");
}
else
{
printf("father/n");
}
}
return 0;
}
大家想想看最後將出現幾個son 幾個father呢?。。。。。。。
對一下答案吧:
$ ./fork
father
son
son
son
father
father
son
father
son
son
father
father
son
father
總共7個son7個father。你答對了嗎? 這道題需要在紙上畫畫才好理解 for i=0 1 2 father father father son son father son son father father son son father son 其中每一行分別代表一個進程的運行列印結果。當產生子進程的時刻,子進程列印son,當子進程調用fork的產生子子進程,他就提升為father。總結來說,father永遠列印father,son在fork之前是son,fork之後就為father,同時產生新的son。