zoukankan      html  css  js  c++  java
  • 进程创建

    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。

  • 相关阅读:
    Apache Ant 1.9.1 版发布
    Apache Subversion 1.8.0rc2 发布
    GNU Gatekeeper 3.3 发布,网关守护管理
    Jekyll 1.0 发布,Ruby 的静态网站生成器
    R语言 3.0.1 源码已经提交到 Github
    SymmetricDS 3.4.0 发布,数据同步和复制
    beego 0.6.0 版本发布,Go 应用框架
    Doxygen 1.8.4 发布,文档生成工具
    SunshineCRM 20130518发布,附带更新说明
    Semplice Linux 4 发布,轻量级发行版
  • 原文地址:https://www.cnblogs.com/shelmean/p/9431997.html
Copyright © 2011-2022 走看看