美文网首页
fork()函数详解

fork()函数详解

作者: Pig_wu饲养员 | 来源:发表于2018-02-07 11:25 被阅读0次

    进程和线程

    进程是资源分配的基本单位,例如内存资源等,进程之间资源是相互隔离的;线程是操作系统调度的最小单位。一个进程可以包括多个线程。

    fork函数

    Unix/linux系统提供了一个fork函数,这个还是比较特殊,执行一次,返回两次;此时通过系统调用创建一个与原来进程(父进程)基本相同的进程(子进程),然后分别在父子进程中返回。子进程返回值永远是0,父进程的返回值是子进程id。这样做的原因是一个父进程可以fork出若干个子进程,所以,父进程需要记住所有的子进程的id,而子进程只需要通过getppid()这个函数,就可以拿到父进程id。

    fork函数返回值

    fork函数可能有三种返回值:
    1)父进程中返回值是子进程的ID
    2)子进程返回值为0
    3)如果出现错误,fork函数返回负值
    fork函数出现错误的情况:
    1)当前进程数已达到系统上限,这时errno的值被设置为EAGAIN。
    2)系统内存不足,这时errno的值被设置为ENOMEM

    python中的fork函数

    python的os模块封装了很多系统调用函数,其中就有fork函数,这样就可在python程序中轻松的创建子线程

    # -*- coding:utf-8 -*-
    
    import os
    
    print "test Process (%s) starting..." % os.getpid()
    
    pid = os.fork()
    
    if pid == 0:
       print "I am child process(%s) and my parent is (%s)" % (os.getpid(), os.getppid())
    
    else:
       print "I (%s) just created a child process(%s)" % (os.getpid(), pid)
    
    

    输出结果为:


    image.png

    从图中的结果可以验证上述结论。

    fork函数的应用

    windows系统中是没有fork调用的,所以上述代码无法再windows中运行。
    有了fork调用,一个进程在接到新任务时就可以复制出一个子进程来处理新任务,常见的Apache服务器就是由父进程监听端口,每当有新的http请求时,就fork出子进程来处理新的http请求

    相关文章

      网友评论

          本文标题:fork()函数详解

          本文链接:https://www.haomeiwen.com/subject/eucwzxtx.html