#include<stdio.h> #include<stdlib.h> #include<string.h> #include <unistd.h> #include<errno.h> //fork进程 //一次调用,两个分支返回 //Linux内核如何做到的这一点? // 每一个进程在各自的地址空间中返回 //为什么fork返回值设计成>0是父进程分支 =0是子进程分支 // 父子关系是1:n的关系,父亲找孩子的pid比较难 //fork理解角度:一次调用,2个分支同时运行, 并发概念. //fork子进程为什么从fork之后运行,不是再从头到尾从main函数重新来一遍? // fork创建子进程的机制有关系. 子进程创建机制:写实复制 // 子进程要拷贝父进程的代码段/堆栈段/数据段/PCB进程控制块(Linux内核管理进程的数据结构) //既然孩子进程拷贝了父进程的运行场景,所以孩子没有必要再运行一边了 //系统错误码放在全局变量errno里面 //在程序中,perror可以把errno对应的string打印出来 //如果在shell下可以通过perror + 错误码打印字符串 int main(void) { printf("sdfsd\n"); pid_t pid; printf("befor fork pid:%d\n", getpid()); //fork子进程 pid = fork(); if(-1 == pid) { perror("fork err"); return 0; } if(pid > 0) // 大于0是父进程 { printf("parent :%d\n", getpid()); } if(0 == pid) { printf("chlid :%d\n", getpid()); } printf("after fork\n"); return 0; } /* 运行结果 ---------------- sdfsd befor fork pid:15554 parent :15554 after fork chlid :15555 after fork ----------------- */