• 进程创建


    fork()

           #include <unistd.h>
    
           pid_t fork(void);

    a)用来创建一个新的进程,调用成功后,将存在两个进程,每个进程都从fork()的返回处继续执行。两个进程执行相同的程序文本段,但各自拥有不同的栈段、数据段和堆段,因为子进程对其父进程的堆段、栈段以及数据段进行了拷贝。

    b)fork() 调用成功后,父进程中返回 子进程的 PID,在子进程中返回 0 。如果调用失败,在父进程中返回 -1,不创建进程。

    c)fork() 调用成功创建子进程后,究竟是父进程先于子进程执行,还是子进程先于父进程执行,这取决于内核的调度。编程时应注意。

     示例

    #include <stdio.h>
    #include <unistd.h>
    
    static int data = 111;
    
    int main()
    {
        int istack = 222;
        pid_t pid;
        switch(pid = fork())
        {
        case -1:
            perror("creat process failure!");
            return -1;
        case 0://child process 
            data *= 3;
            istack *= 3;
            break;
        default://parent process,do nothing but sleep 3 seconds
            sleep(3);
            break;
        }
    
        /*both child and parent come here*/
        printf("(%s)my pid is %d data is %d istack is %d
    ", 
               (pid == 0) ? "child" : "parent", getpid(), data, istack);
        return 0;
    }

    运行结果

    (child)my pid is 119011 data is 333 istack is 666
    (parent)my pid is 119010 data is 111 istack is 222

    父进程睡眠 3 秒,保证子进程先执行。数据结果可以看出,子进程拥有自己的栈和对父进程数据段的拷贝。

    PS:

    子进程ID(pid)返回给父进程的理由是:因为一个进程的子进程可以多个,并且没有一个函数使一个进程可以获得其所有子进程的进程ID。fork() 使子进程返回 0 的理由是:一个进程只会有一个父进程,所以子进程总是可以通过 getppid() 以获得其父进程的进程ID。

  • 相关阅读:
    Linux系统调用
    Kubernetes 中强化tab 功能
    Docker镜像构建之案例分享
    网络基础之名词介绍
    网络基础协议之UDP(下篇)
    网络基础协议之UDP(上篇)
    内核升级
    尼恩 Java高并发三部曲 [官方]
    CDN图解(秒懂
    DNS图解(秒懂
  • 原文地址:https://www.cnblogs.com/shelmean/p/9431997.html
Copyright © 2020-2023  润新知