赞
踩
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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。