创建子进程
fork()
函数,创建成功返回子进程的PID,失败为-1,在子进程中返回值为0,子进程从fork()开始往下执行。
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(){
int ret = fork();
// 根据返回值判断当前进程是子进程还是父进程
if(ret == 0){
printf("I am a son %d\n", getpid());
} else if(ret > 0){
printf("I am parent %d\n", getpid());
} else{
perror("fork");
exit(0);
}
return 0;
}
读时共享写时复制
当创建一个子进程后,操作系统会给进程分配资源,即复制父进程的资源,但这样开销太费时间了,实际实现的是“读时共享写时复制”,即子进程共享父进程的资源,当有一个进程进行写操作时,才会拷贝对象或变量,这样两个进程互不干扰,如果只有读操作,那么不会拷贝。
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(){
int a = 10;
int pipefd[2];
pipe(pipefd);
printf("%p\n", &a);
int ret = fork();
if(ret == 0){
// 变量共享的是父进程的a,所以a的值是10
printf("I am a son %d a=%d\n", getpid(), a);
sleep(1);
printf("I am a son %d a=%d\n", getpid(), a);
a = 12;
printf("I am a son %d a=%d\n", getpid(), a);
} else if(ret > 0){
printf("I am parent %d a=%d\n", getpid(), a);
sleep(2);
// 这个时候,a的值已经被子进程修改了,但是子进程拷贝了,所以无影响
printf("I am parent %d a=%d\n", getpid(), a);
a = 11;
printf("I am parent %d a=%d\n", getpid(), a);
} else{
perror("fork");
exit(0);
}
return 0;
}