函数原型:pid_t fork(void);
system,popen,exec都是通过运行指定进程,含路径
fork没有参数,是赋制进程,子进程和父进程执行位置和执行状态都一样。
fork:创建一个子程序,子进程执行当前程序的副本,返回值为子程序的PID
fork函数的特点:调用一次,返回”两次”
fork函数创建子进程后,父子进程并发执行
子进程是在fork()执行过程中产生,再接着子进程和父进程都执行完,都返回PID,但父子进程返回值不同,父进程返回子进程pid,子进程返回0,这是区分父子进程的原理。
一个父亲,多个孩子进程的框架结构
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
int i;
pid_t pid;//一个父亲,多个孩子
for(i=0;i<3;i++)//i为几就产生几个进程//每个子进程i值不同
{
pid=fork();
if(pid<0)
perror("fork");
if(pid==0)//只有父进程能产生子进程,子进程不能产生子进程
break;
}
//***************************************************************
//给不同子进程派任务
switch(i)//0-4为子进程,5为父进程,共6个进程
{
case 0: //0号子进程
{
sleep(3);
printf("i am 0\n");
}
break;
case 1: //1号子进程
{
sleep(5);
printf("i am 1\n");
}
case 2: //父进程
{
int ret;
pid_t pid1;
for(i=0;i<5;i++)//等5个子进程结束
{
// wait(NULL);
pid1=wait(&ret);//获取子进程的pid和返回值
printf("%d号子进程(PID:%d)执行完毕\n",WEXITSTATUS(ret),pid1);
}
}
break;
}
return i;//返回编号
}