一、使用fork创建子进程
1.1、函数原型
函数原型:pid_t fork(void);
头文件: #include <sys/types.h>
#include <unistd.h>
返回值:成功返回0或子进程的pid
1.2、fork创建的子进程和父进程之间的关系
1)子进程是父进程的拷贝,调用fork函数后,系统会为子进程拷贝fork之前父进程拥有的资源;
2)使用fork创建的子进程和父进程运行在不同的地址空间;
3) 子进程不继承父进程的内存锁、信号量、定时器等资源;
4) fork函数调用一次返回两次,在父进程中返回子进程的pid,在子进程中返回0;
5) 子进程和父进程的数据空间独立,在子进程中改变全局变量不影响父进程同名的全局变量的值;
6)fork函数创建的子进程和父进程的执行顺序是不确定的;
二、使用vfork创建子进程
1.1、函数原型
函数原型:pid_t vfork(void);
头文件: #include <sys/types.h>
#include <unistd.h>
返回值:成功返回0或子进程的pid
2.vfork函数创建的子进程和父进程的关系
1)vfork能够保证子进程始终比父进程先运行;
2)父进程会一直处于挂起状态,直到vfork创建的子进程结束;
3)vfork创建的子进程和父进程共用数据空间,在子进程中改变全局变量的值,在父进程中同样有效;
三、代码实例
fork创建子进程代码:
#include <unistd.h>
#include <pthread.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/select.h>
#include <stdlib.h>
int value = 0;
void main(int argc,char *argv[])
{
int ret = -1;
pid_t pid = 0;
pid = fork();
if(pid < 0)return;
if(pid == 0)
{
while(1)
{
printf("child process,value=%d\r\n",value);
value++;
sleep(1);
if(value == 5)break;
}
}
else
{
while(1)
{
printf("father process,value=%d\r\n",value);
value+=2;
sleep(1);
}
}
}
运行结果:
vfork创建子进程代码:
#include <unistd.h>
#include <pthread.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/select.h>
#include <stdlib.h>
int value = 0;
void main(int argc,char *argv[])
{
int ret = -1;
pid_t pid = 0;
pid = vfork();
if(pid < 0)return;
if(pid == 0)
{
while(1)
{
printf("child process,value=%d\r\n",value);
value++;
sleep(1);
if(value == 5)break;
}
}
else
{
while(1)
{
printf("father process,value=%d\r\n",value);
value+=2;
sleep(1);
}
}
}
运行结果: