首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >forking()和CreateProcess()

forking()和CreateProcess()
EN

Stack Overflow用户
提问于 2012-12-12 20:35:53
回答 3查看 12.4K关注 0票数 7

对于Linux和WinXP,forking()和CreateProcess(带有所有必需的参数)是相同的吗?

如果它们是不同的,那么有人能解释一下在这两种情况下发生的不同吗?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-12 20:47:20

它们在不同的系统上做不同的事情。CreateProcess是一个仅适用于Windows的功能,而fork仅适用于POSIX (例如,Linux和Mac )系统。

fork系统调用创建一个新进程,并从fork函数的调用点开始在父进程和子进程中继续执行。CreateProcess创建一个新进程并从磁盘加载程序。唯一的相似之处在于,最终结果是创建了一个新流程。

有关更多信息,请阅读CreateProcessfork上相应的手册页。

票数 7
EN

Stack Overflow用户

发布于 2018-12-12 09:21:39

CreateProcess执行以下步骤:

  • 创建并初始化内核中的进程控制块。
  • 创建并初始化新的地址空间。
  • 将程序prog加载到地址空间中。
  • 将参数参数复制到地址空间中的内存中。
  • 初始化硬件上下文以在“start”处开始执行。
  • 通知调度程序新进程已准备好运行。

Unix的fork执行以下步骤:

在具有父进程的执行上下文的parent

  • Inherit的地址空间的整个内容的副本的新地址运行的地址空间中创建和初始化新的地址空间中的进程控制块(例如,任何打开的files)

  • Inform
  • 新进程准备好运行

的调度器

它创建父进程的完整副本,并且父进程不为子进程设置运行时环境,因为父进程信任自己的设置。子进程是父进程的完整副本,除了它的进程id ( fork返回的是什么)。派生进程继续运行与其父进程相同的程序,直到它执行显式exec。当子进程调用exec时,新的可执行映像将进入内存并运行。

制作完整副本的效率如何?写入时复制。它实际上只复制了虚拟内存映射。段表中的所有段都是只读的。如果父进程或子进程编辑数据段中的数据,则会抛出异常,并且内核会创建该数据段的完整内存副本。这个answer很好地解释了这一点

在父级和子级之间共享资源有几个好处:-直观地说,资源管理:需要更少的内存来维护进程的状态-共享缓存资源意味着当数据没有被覆盖时,数据的临时局部性更高,这提高了性能,因为从更大的缓存/磁盘检索数据非常耗时。

共享资源的缺点:-当写操作很常见时,它会使另一个进程的数据处于无效状态,这会导致一致性未命中,如果子进程在单独的内核上运行,这是代价高昂的,因为更改将必须向上传播到L3高速缓存。

一般来说,程序读的内容比写的要多得多,通常子/父程序只需要对其堆栈进行写操作,而这只是其程序块的一小部分。

此外,Unix fork是不同的,因为它返回两次,一次在父进程(其子进程的进程id )中,一次在子进程(0,恭喜您是一个新的子进程)中,这是我们在代码中区分我们是子进程还是父进程的方式。

Unix Exec执行以下操作:

  • 将程序prog加载到当前地址空间中。
  • 将参数参数复制到硬件上下文的地址中的内存中,以便在“start”处开始执行。

父级可以选择等待子级完成。当子进程完成时,当调用exit时,将通知父进程的等待。

票数 4
EN

Stack Overflow用户

发布于 2014-03-13 16:05:26

我将举两个例子来说明不同之处:

fork()

代码语言:javascript
复制
#include "stdio.h"  
#include "stdlib.h"
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int fac(int);
int main(void)  
{
    int child_ret,input_num=-1;
    pid_t pid1;
    while(input_num<0){
        printf("\nPlease input a non-negative number:  ");
        scanf("%d",&input_num);
    }
    if((pid1=fork())<0){
        printf("fork error");
    }
    else if(pid1==0){
        printf("\nI am the child process,my PID is %d.\n\nThe first %d numbers of fibonacci sequence is:\n", getpid(),input_num);
        for (int i=0;i<input_num;i++)
        {printf("%d\n", fac(i+1));}
    }
    else{
        wait(&child_ret);
        printf("\nI am the parent process,my PID is %d.\n\n", getpid());
    }
    return 0;
}
int fac(int n)
{
    if (n<=2) return n-1;
    else 
    {
        return fac(n-1)+fac(n-2);
    }
}

在此程序中,fork将执行复制并返回两个值。我们将复制的进程称为父进程,将另一个子进程称为process.If ()函数,整个进程将被一个新程序替换,但PID除外。

CreateProcess()

代码语言:javascript
复制
#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void _tmain( VOID )
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    LPTSTR szCmdline=_tcsdup(TEXT("MyChildProcess"));

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    // Start the child process.
    if( !CreateProcess( NULL,   // No module name (use command line)
       szCmdline,      // Command line
       NULL,           // Process handle not inheritable
       NULL,           // Thread handle not inheritable
       FALSE,          // Set handle inheritance to FALSE
       0,              // No creation flags
       NULL,           // Use parent's environment block
       NULL,           // Use parent's starting directory
       &si,            // Pointer to STARTUPINFO structure
       &pi )           // Pointer to PROCESS_INFORMATION structure
       )
    {
       printf( "CreateProcess failed (%d)./n", GetLastError() );
       return;
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles.
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}

这是一个来自MSDN的示例。在Windows系统中,我们所说的创建一个新进程必须是一个独立的*.exe程序。新的过程是一个全新的过程,只与旧过程的返回值有唯一的联系。

总而言之,我们经常把fork()+exec()看作CreateProcess()。事实上,在Windows中,fork()更类似于CreateThread()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13839935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档