zoukankan      html  css  js  c++  java
  • fork & vfork

    fork

    fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别:
    1. fork ():子进程拷贝父进程的数据段,代码段
    vfork ( ):子进程与父进程共享数据段
    2. fork ()父子进程的执行次序不确定
    vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec
    或exit 之后父进程才可能被调度运行。
    3. vfork ()保证子进程先运行,在她调用exec 或exit 之后父进程才可能被调度运行。如果在
    调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。


    from: https://blog.csdn.net/jianchi88/article/details/6985326

    调用fork时,内核会在copy_files函数中处理拷贝父进程打开的文件的相关事宜

    kernel/fork.c

    static int copy_files(unsigned long clone_flags, struct task_struct *tsk)
    {
        struct files_struct *oldf, *newf;
        int error = 0;
    
        /*
         * A background process may not have any files ...
         */
        oldf = current->files;
        if (!oldf)
            goto out;
    
        if (clone_flags & CLONE_FILES) {
            atomic_inc(&oldf->count);
            goto out;
        }
    
        newf = dup_fd(oldf, NR_OPEN_MAX, &error);
        if (!newf)
            goto out;
    
        tsk->files = newf;
        error = 0;
    out:
        return error;
    }

    CLONE_FILES标志位用来控制是否共享父进程的文件描述符。如果该标志位置位,则表示不必费劲复制一份父进程的文件描述符了,增加引用计数,直接共用一份就可以了。对于vfork函数和创建线程的pthread_create函数来说都是如此。但是fork函数却不同,调用fork函数时,该标志位为0,表示需要为子进程拷贝一份父进程的文件描述符。文件描述符的拷贝是通过内核的dup_fd函数来完成的。

    from:

    https://www.cnblogs.com/sky-heaven/p/8073949.html

     
  • 相关阅读:
    人生中最重要的三位老师
    自我介绍
    秋季学习总结
    第五周学习总结
    第四周总结
    第三周基础作业
    判断上三角矩阵
    第二周作业及编程总结
    求最大值及其下标
    查找整数
  • 原文地址:https://www.cnblogs.com/aspirs/p/15024673.html
Copyright © 2011-2022 走看看