• 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

     
  • 相关阅读:
    给一个二维数组随机赋值
    sql server use WAITFOR DELAY to wait some milliseconds
    sql server print time with milliseconds
    UE4 LeapMotion 获取手掌朝向
    Unity打包Android出现Failed to find Build Tools revision
    UE4中Yaw,Roll,Pitch分别对应什么轴?
    Unity 遍历场景所有物体(包括隐藏及被禁用的物体)
    C#-Linq扩展方法DistinctBy
    Unity编辑器扩展--Scene Manager
    Unity查找功能编辑器扩展Searcher
  • 原文地址:https://www.cnblogs.com/aspirs/p/15024673.html
Copyright © 2020-2023  润新知