1.父子进程简介
子进程会复制父进程用户区数据,内核区也会进行复制,pid不一样
2.写实拷贝
- 传统fork() :
- 一般将所有资源复制给新创建的进程,而如果新进程立即执行一个新的印象,所有的拷贝都会前功尽弃。
- 写实拷贝:
- 原本数据只有只读权限,这个时候父进程与子进程共享一块内存,例如
num = 10
,不修改的时候父子进程指向同一个num = 10
,需要修改的时候才会从系统中获取一块内存,这个之后关于num = 10
的内存就会变得相互独立
3.举例说明
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
//创建子进程
pid_t pid = fork();
int num = 10;
//判断是子进程还是父进程
if (pid > 0)
{
printf("pid: %d\n", pid);
//大于0,返回的就是子进程的id号
num += 20;
printf("parent is %d。\n", num);
printf("I am Parent. pid: %d ppid:%d\n", getpid(), getppid());
}
else if (pid == 0)
{
printf("pid: %d\n", pid);
//等于0,表示pid为子进程
num += 100;
printf("child is %d。\n", num);
printf("I am child. pid: %d ppid:%d\n", getpid(), getppid());
}
else
{
perror("fork");
return -1;
}
for (int i = 0; i < 5; i ++ )
{
printf("i: %d, pid: %d\n", i, getpid());
sleep(1);
}
return 0;
}