函數原型: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;//返回編號
}