您的位置:首页 > 运维架构 > Linux

进程fork和vfork函数复习

2017-11-06 19:59 579 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linuxC