功能:创建一个进程
参数:无参
返回值:pid_t是int的别名,含义:
小于0,代表创建子进程失败,可以打印错误码查看原因
等于0,是在子进程中返回的
大于0,是在父进程中返回的,且含义为子进程的ID号(PID)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid =fork();
if(pid < 0)
{
perror("创建失败\n");
return -1;
}
if(pid ==0)
{
while(1)
{
printf("目前在子进程中\n");
sleep(1);
}
}
else
{
while(1)
{
printf("目前在父进程中\n");
printf("子进程的PID是:%d \n",pid);
sleep(1);
}
}
return 0;
}
代码演示用fork系统调用,子进程和父进程空间是独立的
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int i=0;
pid_t pid =fork();
if(pid < 0)
{
perror("创建失败\n");
return -1;
}
if(pid ==0)
{
while(1)
{
i++;
printf("目前在子进程中\n");
printf("子进程的i=%d\n",i);
sleep(1);
}
}
else
{
while(1)
{
printf("目前在父进程中\n");
printf("父进程的i=%d\n",i);
printf("子进程的PID是:%d \n",pid);
sleep(1);
}
}
return 0;
}
验证fork之前,子进程会悉数拷贝父进程的所有内容:fork之前父进程有的,子进程都会拷贝一份![](https://img-blog.csdnimg.cn/direct/390bcb4f16a54f2b95f2caaf90f4827c.png)
总结fork()
fork
创建的子进程:
1
、会完美拷贝父进程中的所有资源(堆栈段,代码段,数据段
...
)
2
、子进程从
fork
的下一句话开始,会存在父子进程,为了区分两个进程到底谁在执行?
---
》通过返回值来判断:等于
0
(子进程在执行)。大于
0
(父进程在执行)
3
、子进程永远都是在
fork
的下一句开始执行的!(会用到
fork
之前父进程定义过的一些资源。)、
4
、父子进程的执行次序不确定的!
5
、父子进程的地址空间独立,互不影响,父子进程可以被
CPU
进行调度。