#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
-----------------
*/