fork創(chuàng)建進程
函數(shù)原型如下
#include//必須引入頭文件茬末,使用fork函數(shù)的時候婿禽,必須包含這個頭文件掺涛,否則,系統(tǒng)找不到fork函數(shù)
pid_t fork(void); //void代表沒有任何形式參數(shù)
父進程與子進程
1.掌握概念匿情,什么是父進程兰迫,什么是子進程
除了0號進程(系統(tǒng)創(chuàng)建的)之外,linux系統(tǒng)中都是由其他進程創(chuàng)建的炬称。創(chuàng)建新進程的進程汁果,即調(diào)用fork函數(shù)的進程為父進程,新建的進程為子進程玲躯。
2.fork函數(shù)不需要任何參數(shù)据德,對于返回值有三種情況
1)對于父進程,fork函數(shù)返回新建子進程的pid跷车;
2)對于子進程棘利,fork函數(shù)返回0;
3)如果出錯朽缴,fork函數(shù)返回-1善玫。
創(chuàng)建進程案例(fork.c)
#include
#include
#include
int main(void)
{
pid_t pid ;
pid = fork();
if(pid < 0)
{
printf("fail to fork\n");
exit(1);
}
if(pid == 0)
{
printf("this is the child,pid is : %u\n",getpid());
exit(0);
}
if(pid > 0)
{
printf("this is the parent\n");
exit(0);
}
return 0;
}
在shell中編譯該程序如下:
gcc fork.c -o fork
在shell中運行該程序如下:
./fork
最后輸出結(jié)果:
再次運行結(jié)果如下:
父子進程共享資源
1.父子進程共享代碼段(可讀的)
父進程在創(chuàng)建子進程的時候,子進程會把父進程的地址空間里的數(shù)據(jù)段密强。和棧堆進行復(fù)制蝌焚,但是沒有復(fù)制代碼段裹唆。
2.詳細可看具體代碼示例(fork_1.c)
fork_1.c
#include
#include
#include
int global; //全局變量在數(shù)據(jù)段中
int main()
{
pid_t pid;
int stack = 1; //局部變量在棧中
int * heap;
heap = (int *)malloc(sizeof(int)); //在堆中
*heap = 2;
pid = fork();
if(pid < 0)
{
printf( " fail to fork\n " ) ;
exit(1) ;
}
if( pid == 0 )
{
global++ ;
stack ++ ;
(*heap)++ ;
printf ( " the child , data : %d , stack : %d , heap : %d\n", global , stack , * heap ) ;
exit(0) ;
}
sleep(2) ;
printf("the parent, data : %d, stack : %d, heap : %d\n", global , stack , *heap);
return 0 ;
}
運行結(jié)果如下:
fork函數(shù)出錯的情況
1.fork函數(shù)返回值為-1即創(chuàng)建失敗誓斥,有兩種情況可能會導(dǎo)致fork函數(shù)出錯只洒;
2.系統(tǒng)中已經(jīng)有太多的進程存在;
3.調(diào)用fork函數(shù)的用戶的進程太多劳坑。
原文鏈接:http://www.maiziedu.com/wiki/process/fork/