• [学习笔记]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
    ");
        
        pid_t pid;
        printf("befor fork pid:%d
    ", getpid());
        
        //fork子进程
        pid = fork();
        if(-1 == pid)
        {
            perror("fork err");
            return 0;
        }
        if(pid > 0) // 大于0是父进程
        {
            printf("parent :%d
    ", getpid());
        }
        if(0 == pid)
        {
            printf("chlid :%d
    ", getpid());
        }
        
        printf("after fork
    ");
        
        
        return 0;
    }
    
    /*
    运行结果
    ----------------
    sdfsd
    befor fork pid:15554
    parent :15554
    after fork
    chlid :15555
    after fork
    -----------------
    */
  • 相关阅读:
    execvp
    Linux系统调用getrlimit()与setrlimit()函数详解
    Va_start及Vsprintf应用
    waitpid()
    sdut 2408 Pick apples 夜
    poj 1273 Drainage Ditches 夜
    poj 1408 Fishnet 夜
    poj 1113 Wall 夜
    poj 1584 A Round Peg in a Ground Hole 夜
    poj 3007 Organize Your Train part II 夜
  • 原文地址:https://www.cnblogs.com/shichuan/p/4428618.html
Copyright © 2020-2023  润新知