c++中的fork函数_LinuxCC++——fork()函数基础
⼀、定义
1.fork系统调⽤⽤于创建⼀个新进程,称为⼦进程,它与进程(称为系统调⽤fork的进程)同时运⾏,此进程称为⽗进程。创建新的⼦进程后,两个进程将执⾏fork()系统调⽤之后的下⼀条指令。⼦进程使⽤相同的pc(程序计数器),相同的CPU寄存器,在⽗进程中使⽤的相同打开⽂件。
它不需要参数并返回⼀个整数值。下⾯是fork()返回的不同值。
负值:创建⼦进程失败。
零:返回到新创建的⼦进程。
正值:返回⽗进程或调⽤者。该值包含新创建的⼦进程的进程ID。
2.所要⽤到的头⽂件有:
#include
#include
3.说明:
——⽗、⼦进程完全⼀样(代码、数据),⼦进程从fork内部开始执⾏,fork返回⼦进程的pid后,接着执⾏下⼀条语句。
——该函数被调⽤⼀次,但返回两次。两次返回的区别是⼦进程的返回值是0,⽽⽗进程的返回值则是⼦进程的ID。
——⼀般来说,在fork之后是⽗进程先执⾏还是⼦进程先执⾏是取决于内核锁使⽤的调度算法。
4.⽰例代码(⼀)——这段程序通过fork函数不同的返回值来验证不同的进程在运⾏,同时通过⼀些全局变量和局部变量来看到⽗⼦进程之间的继承关系。
#include#include#include#include
int galbol = 6;//定义全局变量
char buf[] = "Hello Linux";//定义⼀个字符串
intmain(){int var = 88;//定义⼀个局部变量
pid_t pid;//(pid_t 是⼀个宏定义,其实质是int 被定义在#include中)
puts(buf);//输出字符串
pid = fork();//执⾏fork函数并把返回值赋给pid
if (pid < 0)//如果返回值⼩于0,则创建失败
{
printf("error\n");
exit(0);
}if (pid == 0)//返回值等于0,表⽰创建成功,是⼦进程运⾏
{
printf("This is children process!\n");
galbol++;var++;
}else //如果返回ID就是⽗进程
{
printf("This is parent process\n");
}
printf("pid=%d,ppid=%d,galbol=%d,var=%d\n",getpid(),getppid(),galbol,var);//⽤来测试的变量
return 0;
}
运⾏结果
讲解⼀下运⾏结果,⾸先输出了"Hello Linux!",这是我们放在创建进程之前的⼀个输出,接着创建⼀个进程,返回值是ID,则表明当前是⽗进程,接着输出⼏个变量,当前进程ID和⽗进程ID,变量galbol和val,由于在⽗进程中没有对两个变量的值进⾏修改,所以两个变量的值未发⽣改变。那接下来就是⼦进程,返回值是0,输出⾃⼰是⼦进程,然后执⾏⼦进程的代码,可以看到⼦进程的pid=5263,⽗进程
ID=5983,刚好等于前⾯⽗进程的ID,并且修改了两个变量的值。
5.⽰例代码(⼆)——这次的demo是在⽗进程中打开⼀个⽂本⽂件,并进⾏读操作,再看创建的⼦进程能否也读取与⽗进程⼀样的⽂本⽂件。
#include#include#include#include
char str[10]; //定义⼀个数组,⽤来测试
intmain() {
FILE*fp; //fp⽂件指针
pid_t pid; //进程号
pid =fork();
fp= fopen("a.txt","r"); //以只读的⽅式打开⽂件
if (fp ==NULL)
{
printf("Open error!"); //如果指针返回的值为NULL,则打开失败
exit(0);
}else{if(pid < 0) //fork返回值⼩于0,创建失败
{
printf("Error!\n");
exit(0);
}else if (pid == 0) //fork等于0,返回到新建的⼦进程
{
fread(str,sizeof(char),2,fp); //读两个字符,并输出到屏幕
puts(str);
}else //否则返回到⽗进程
{
sleep(2);
fseek(fp,2L,SEEK_SET); //定位到⼦进程读取的两个字符之后开始
fread(str,sizeof(char),3,fp);//读取三个字符
linux下的sleep函数puts(str);
}
}return 0;
}
这是a.txt⾥⾯的内容
这是运⾏结果
可以看到,⼦进程打开了与⽗进程⼀样的⽂本⽂件。
6.总结⼀下:使⽤fork函数得到的⼦进程从⽗进程处继承了整个进程的地址空间,包括进程上下⽂、进程堆栈、内存信息、打开的⽂件描述符、信号控制设置、进程优先级、进程组号、当前⼯作⽬录、根⽬录、资源限制、控制终端等

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。