[学习笔记]fork深入理解

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

 

posted @ 2015-04-15 15:09  张仕传  阅读(386)  评论(0编辑  收藏  举报