2.fork创建子进程
getpid 获取当前进程id
getppid 获取当前进程的父进程的id
pid_t fork()
1.为什么fork有两个返回值?
因为这两个返回值是由不同的进程return出来的,而不是由一个fork函数返回两个数。
(fork后,进程由一个变成两个,两个进程分别有一个返回值)
返回值:
<0:失败
>0:当前进程为父进程(父进程的返回值)
=0:当前进程为子进程(子进程的返回值)
2.子进程创建成功后,代码的执行的开始位置?
fork代码段的位置
3.父子进程的执行顺序?
不一定谁先谁后(看谁抢到CPU资源)
4.如何区分父子进程?
通过fork的返回值
案例1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(){
for(int i=0;i<4;i++) //仅仅在父进程中执行一次
printf("---------%d\n",i);
pid_t pid=fork();
if(pid<0){
perror("fork fail");
}
if(pid>0){ //parent process
printf("parent process,pid=%d\n",getpid());
}
if(pid==0){ //child process
printf("child process,pid=%d\n",getpid());
}
for(int i=0;i<4;i++) //在父进程和子进程中各执行一次
printf("%d\n",i);
}
[[email protected] 1-fork]$ gcc fork.c -o fork --std=c99 #编译代码
[[email protected] 1-fork]$ ./fork #执行结果
---------0
---------1
---------2
---------3
parent process,pid=117802
0
1
2
3
child process,pid=117803
0
1
2
3
案例2:循环创建number个子进程
父进程
子进程1 子进程2 子进程3 ...... 子进程number
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(){
int i;
int number=5;
pid_t pid;
for(i=0;i<number;i++){
pid=fork();
if(pid<0){
perror("fork fail");
exit(1);
}
if(pid==0)
break;
}
for(int j=0;j<number;j++){ //判断子进程是第几个孩子
if(j==i)
printf("%d process,pid=%d\n",j,getpid());
}
if(i==number) //判断父进程是哪一个:(父进程退出for循环时,i==number)
printf("parent process,pid=%d\n",getpid());
}
[[email protected] 1-fork]$ ./fork
0 process,pid=70113
1 process,pid=70114
2 process,pid=70115
parent process,pid=70112
4 process,pid=70117
3 process,pid=70116
写时拷贝原则write-on-copy
1.读时共享
刚fork出来之后,两个地址空间用户区数据完全相同,父子进程都指向同一块共享区域,父子进程中
都映射到共享区域中的变量(int num)
2.写时拷贝
当后续父子进程对共享区域中的变量进行不同的操作时(父进程对num++,子进程对num--),
===>发生写时拷贝原则,父子进程各自拷贝出来int大小的空间存放自己的num,因此父子进程
中的num是相互独立,互不影响的====>因此父子进程之间不能够使用全局变量进行通信。