linux进程开发之(二):fork函数
时间:2010-10-25 来源:andyluo324324
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h> int main(void)
{
pid_t result; //定义一个pid_t类型的变量,至于是什么类型的,不用管,具体
//看内核原代码
result=fork(); //调用fork函数,读其返回值
if(result==-1) //异常判断
{
perror("fork");
exit;
}
else if(result==0)//代表运行在子进程
{
printf("the return value is %d\n In chlid process !!\n my pid is %d\n",result,getpid());
}
else //代表运行在父进程
{
printf("the return value is %d\n in father process !!\n my pid is %d\n",result,getpid());
}
}
/*------------------------------------------------
notes:
1.fork():它执行一次却返回两个值
2.fork函数说明:
fork函数用于从已存在进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。
这两个分别带回它们各自的返回值,其中父进程的返回值是子进程的进程号,而子进程则
返回0。因此,可以通过返回值来判断该进程是父进程还是子进程。
3.使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址
空间,包括进程上下文,进程堆栈,内存信息,打开的文件描述符,信号控制设定,进程
优先级,进程组号,当前工作目录,根目录,资源限制,控制终端等,而子进程所独有的只
有它的进程号,资源使用和计时器。
3.fork函数语法:
1)需头文件
#include<sys/types.h> //提供类型pid_t的定义
#include<unistd.h>
2)函数原型:
pid_t fork(void)
3)函数返回值
0:子进程
子进程ID(大于0的整数):父进程
-1:出错
4.函数使用注意点:
fork函数使用一次就创建一个进程,所以若把fork函数放在了if else判断语句中则要小心,
不能多次使用fork函数.
5.vfork:
由于fork完整copy了父进程的整个地址空间,因此执行速度是很慢的,为了加快执行速度,
系统设计者创建了vfork.vfork也能创建新进程,但它不产生父进程的副本.它是通过允许
父子进程可访问相同物理内存从而伪装了对进程地址空间的真实copy,当子进程需要改变内
存中数据时才copy父进程。
6.vfork函数说明:
1)需头文件
#include<sys/types.h> //提供类型pid_t的定义
#include<unistd.h>
2)函数原型:
pid_t vfork(void)
3)返回值
如果vfork()成功则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则
返回0。如果vfork失败则直接返回-1,失败原因存于errno中。
7.fork PK vfork
区别:
1).fork:子进程COPY父进程的数据段。
vfork:子进程与父进程共享数据段。
2).fork:父,子进程的执行次序不确定。
vfork:子进程先运行,父进程后运行。
-----------------------------------------------*/
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h> int main(void)
{
pid_t result; //定义一个pid_t类型的变量,至于是什么类型的,不用管,具体
//看内核原代码
result=fork(); //调用fork函数,读其返回值
if(result==-1) //异常判断
{
perror("fork");
exit;
}
else if(result==0)//代表运行在子进程
{
printf("the return value is %d\n In chlid process !!\n my pid is %d\n",result,getpid());
}
else //代表运行在父进程
{
printf("the return value is %d\n in father process !!\n my pid is %d\n",result,getpid());
}
}
/*------------------------------------------------
notes:
1.fork():它执行一次却返回两个值
2.fork函数说明:
fork函数用于从已存在进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。
这两个分别带回它们各自的返回值,其中父进程的返回值是子进程的进程号,而子进程则
返回0。因此,可以通过返回值来判断该进程是父进程还是子进程。
3.使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址
空间,包括进程上下文,进程堆栈,内存信息,打开的文件描述符,信号控制设定,进程
优先级,进程组号,当前工作目录,根目录,资源限制,控制终端等,而子进程所独有的只
有它的进程号,资源使用和计时器。
3.fork函数语法:
1)需头文件
#include<sys/types.h> //提供类型pid_t的定义
#include<unistd.h>
2)函数原型:
pid_t fork(void)
3)函数返回值
0:子进程
子进程ID(大于0的整数):父进程
-1:出错
4.函数使用注意点:
fork函数使用一次就创建一个进程,所以若把fork函数放在了if else判断语句中则要小心,
不能多次使用fork函数.
5.vfork:
由于fork完整copy了父进程的整个地址空间,因此执行速度是很慢的,为了加快执行速度,
系统设计者创建了vfork.vfork也能创建新进程,但它不产生父进程的副本.它是通过允许
父子进程可访问相同物理内存从而伪装了对进程地址空间的真实copy,当子进程需要改变内
存中数据时才copy父进程。
6.vfork函数说明:
1)需头文件
#include<sys/types.h> //提供类型pid_t的定义
#include<unistd.h>
2)函数原型:
pid_t vfork(void)
3)返回值
如果vfork()成功则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则
返回0。如果vfork失败则直接返回-1,失败原因存于errno中。
7.fork PK vfork
区别:
1).fork:子进程COPY父进程的数据段。
vfork:子进程与父进程共享数据段。
2).fork:父,子进程的执行次序不确定。
vfork:子进程先运行,父进程后运行。
-----------------------------------------------*/
相关阅读 更多 +