一个现有的进程可以调用fork函数创建一个新的进程。
原函数如下:
NAME
fork - create a child process
SYNOPSIS
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
返回值:子进程返回0,父进程返回子进程的ID,出错返回-1。
测试代码如下:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int fpid = getpid();//获取父进程的进程号
int pid = fork();
if(pid>0)//父进程
{
printf("this is fatherpid = %d\n",fpid);
printf("this is my sonpid = %d\n",pid);
}
else if(pid==0)//子进程
{
printf("this is sonpid = %d\n",getpid());
}
return 0;
}
多进程模拟服务器代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int client;
int pid;
while(1){
scanf("%d",&client);
if(client==1)
{
pid = fork();
if(pid>0){
printf("one client connect...\n");
}
else if(pid==0)
{
while(1)
{
printf("this is my pid = %d\n",getpid());
sleep(1);
}
}
}
}
return 0;
}
vfork()会产生一个新的子进程.但是vfork创建的子进程与父进程共享数据段,而且由vfork()创建的子进程将先于父进程运行。
原函数如下:
NAME
vfork - create a child process and block parent
SYNOPSIS
#include <sys/types.h>
#include <unistd.h>
pid_t vfork(void);
返回值:子进程返回0,父进程返回子进程的ID,出错返回-1。
测试代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int fpid = getpid();//获取父进程的进程号
int pid = vfork();
if(pid>0)//父进程
{
printf("this is fatherpid = %d\n",fpid);
printf("this is my sonpid = %d\n",pid);
}
else if(pid==0)//子进程
{
printf("this is sonpid = %d\n",getpid());
exit(0);
}
return 0;
}
总结:
- fork():子进程拷贝父进程的数据段,代码段. vfork():子进程与父进程共享数据段.
- fork():父子进程的执行次序不确定.
vfork():保证子进程先运行,在调用exec或_exit之前与父进程数据是共享的,在它调用exec
或_exit之后父进程才可能被调度运行。 - vfork()保证子进程先运行,在她调用exec或_exit之后父进程才可能被调度运行。如果在
调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。 - 当需要改变共享数据段中变量的值,则拷贝父进程。