一、作用:创建一个子进程
二、接口
#include <unistd.h>
pid_t fork(void);
1.返回值:进程创建成功时,父进程fork结束后返回子进程的进程ID,子进程返回0;失败返回-1。
2.pid_t:类型表示进程ID,但为了表示-1,它是有符号整型。
3.在父进程执行fork后,fork函数才变为2个,子进程虽然有fork函数,但是不会再创建其子进程。
三、创建一个子进程
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(){
printf("父子进程共同的代码\n");
pid_t pid = fork(); //fork创建进程
if(pid == -1){
perror("fork error:");
exit(1);
} else if(pid==0){ //子进程的fork返回0
printf("I am child ,我的进程pid = %u,我的父进程ppid = %u\n", getpid(),getppid());
} else {//父进程fork返回>0
printf("I am parent,我的进程 pid = %u,我的父进程ppid = %u\n", getpid(),getppid());
sleep(2); //父进程休息一下
}
printf("父子进程共同代码\n");
return 0;
}
四、一个父进程创建多个子进程
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(){
int i;
pid_t pid;
for(i=0; i<4; ++i) //创建4个子进程
{
pid=fork(); //创建进程
if(pid==-1){
perror("fork error:");
exit(1);
} else if(pid==0) //子进程
break; //子进程直接跳出循环
else //返回值pid>0,父进程
continue; //父进程i++继续创建子进程
}
if(i<4){ //子进程
sleep(i); //控制进程的执行顺序
printf("I am %d child,my id is pid=%u\n",i+1,getpid());
}
else{
sleep(i);
printf("I am parent\n");
}
return 0;
}
/*
由于创建完子进程之后,父子进程的执行的先后顺序未知,谁先抢到cpu谁就先执行
*/
五、刚fork后,父子进程有哪些相同和不同
1.相同点:.text、全局变量、.data、栈、堆、环境变量、信号处理方式、用户ID、进程工作目录等。
2.不同点:进程ID、fork返回值、父进程ID、程序运行时间、定时器、未决信号集。
3.父子进程共享的内容:① 文件描述符(打开文件的结构体),② mmap建立的映射区。
4.数据操作规则:读时共享,写时复制。