进程fork和vfork函数复习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fr555wlj/article/details/78461184

1.fork函数的使用;
fork( )函数的作用是创建一个新的进程。
在应用程序调用fork( )函数后,会创建一个新的进程,称为子进程,原来的进程叫做父进程。从此,运行的已经是两个进程了。
子进程和父进程都可以得到fork函数的返回值。子进程中,fork返回0;父进程中,fork返回子进程的进程号。若创建失败,返回-1.
pid_t fork(void);
功能:创建子进程
fork的奇妙之处在于它被调用一次,却返回两次,它可能有三种不同的返回值:
1.在父进程中,fork返回新创建的子进程的PID;
2.在子进程中,fork返回0;
3.如果出现错误,fork返回一个负值
这里重点是上面的黑体部分,案例代码如下:

#include <sys/types.h>
#include <unistd.h>
main()
{
pid_t pid; //pid_t是一个宏定义,其数据类型为unsigned int
/*此时仅有一个进程*/
pid=fork();
/*此时已经有两个进程在同时运行*/
if(pid<0)
printf("error in fork!");
else if(pid==0)
printf("I am the child process, ID is %d\n",getpid());
else
printf("I am the parent process,ID is %d\n",getpid());
}

先来看运行结果:

 ~/LinuxC$ ./createProgress 
I am the parent process,ID is 3186
I am the child process, ID is 3187

在上述代码中,只有一个if判断语句,结果确实输出了两条判断值,可见,fork函数的确是被调用一次,却返回两次.
2.父子进程共享代码
在pid=fork()之前,只有一个进程在执行,但在这条语句执行之后,就变成两个进程在执行了,这两个进程的共享代码段,将要执行的下一条语句都是if(pid==0)。两个进程中,原来就存在的那个进程被称作“父进程”,新出现的那个进程被称作“子进程”,父子进程的区别在于进程标识符(PID)不同
示例代码:

#include <unistd.h>
#include <stdio.h>
int main(void)
{
pid_t pid;
int count=0;
pid = fork();
count++;
printf( “count = %d\n", count );
return 0;
}

返回结果如下:

wulongjian@wulongjian-Inspiron-5557:~/LinuxC$ ./createProgress2
count = 1
count = 1

这里,代码上面只有一个printf,但是却输出了两边count值,可见,父子进程共享代码片段,但是,子进程的数据空间、堆栈空间都会从父进程得到一个拷贝,而不是共享。.
3.vfork函数
fork:子进程拷贝父进程的数据段
vfork:子进程与父进程共享数据段
fork:父、子进程的执行次序不确定
vfork:子进程先运行,父进程后运行
示例代码:

# include <unistd.h>
# include <stdio.h>
int main(void)
{
 pid_t pid;
 int count=0;
 pid = vfork();
 count++;
 printf( “count = %d\n", count );
 _exit(0);//这里要加退出函数,不然父进程会一直阻塞,程序报错.
 return 0;
}

输出如下:

count=1
count=2

猜你喜欢

转载自blog.csdn.net/fr555wlj/article/details/78461184
今日推荐