zoukankan      html  css  js  c++  java
  • linux --> fork()详解

    fork()详解

      一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。

      fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
          1)在父进程中,fork返回新创建子进程的进程ID;
          2)在子进程中,fork返回0;
          3)如果出现错误,fork返回一个负值;

      fork出错可能有两种原因:

          1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。
          2)系统内存不足,这时errno的值被设置为ENOMEM。

    例子:

    #include <unistd.h>
    #include <stdio.h> 
    int main () 
    { 
        pid_t fpid; //fpid表示fork函数返回的值
        int count=0;
        fpid=fork(); 
        if (fpid < 0) 
            printf("error in fork!"); 
        else if (fpid == 0) {
            printf("i am the child process, my process id is %d/n",getpid()); 
            printf("我是爹的儿子/n");//对某些人来说中文看着更直白。
            count++;
        }
        else {
            printf("i am the parent process, my process id is %d/n",getpid()); 
            printf("我是孩子他爹/n");
            count++;
        }
        printf("统计结果是: %d/n",count);
        return 0;
    }

    结果是:

     i am the child process, my process id is 5574
     我是爹的儿子
     统计结果是: 1
     i am the parent process, my process id is 5573
     我是孩子他爹
     统计结果是: 1

      在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。可以通过fork返回的值来判断当前进程是子进程还是父进程。

      创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。

      每个进程都有一个独特(互不相同)的进程标识符(process ID),可以通过getpid()函数获得,还有一个记录父进程pid的变量,可以通过getppid()函数获得变量的值。

  • 相关阅读:
    docker使用常用命令:启动/重启/关闭docker
    golang 中内存模型
    【转】Linux fork操作之后发生了什么?又会共享什么呢?
    go检查channel是否关闭
    golang select case 用法
    【转】理解字节序 大端字节序和小端字节序
    【转】3种TCP连接异常的情况。
    react-window 多条列表数据加载(虚拟滚动)
    ts 中 interface 与 class 的区别
    js new一个对象的过程,实现一个简单的new方法
  • 原文地址:https://www.cnblogs.com/jeakeven/p/5300967.html
Copyright © 2011-2022 走看看