首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >fork和exec之间的区别

fork和exec之间的区别
EN

Stack Overflow用户
提问于 2009-10-31 11:47:33
回答 5查看 144.9K关注 0票数 221

forkexec之间的区别是什么

EN

回答 5

Stack Overflow用户

发布于 2009-10-31 11:51:59

fork()将当前进程拆分为两个进程。或者换句话说,你的好的线性的容易想到的程序突然变成了运行一段代码的两个独立的程序:

代码语言:javascript
复制
 int pid = fork();

 if (pid == 0)
 {
     printf("I'm the child");
 }
 else
 {
     printf("I'm the parent, my child is %i", pid);
     // here we can kill the child, but that's not very parently of us
 }

这可能会让你大吃一惊。现在,您有一段状态几乎相同的代码正由两个进程执行。子进程继承刚刚创建它的进程的所有代码和内存,包括从fork()调用停止的地方开始。唯一的区别是fork()返回代码告诉您您是父级还是子级。如果您是父对象,则返回值是子对象的id。

exec更容易掌握,您只需告诉exec使用目标可执行文件执行一个进程,并且不会有两个进程运行相同的代码或继承相同的状态。就像@Steve Hawkins所说的,可以在fork之后使用exec在当前进程中执行目标可执行文件。

票数 55
EN

Stack Overflow用户

发布于 2013-05-22 11:23:38

Fork创建一个调用进程的副本。通常遵循以下结构

代码语言:javascript
复制
int cpid = fork( );

if (cpid = = 0) 
{

  //child code

  exit(0);

}

//parent code

wait(cpid);

// end

(对于子进程text( code )、data、stack与调用进程相同)子进程执行if块中的代码。

EXEC用新进程的代码、数据、堆栈替换当前进程。通常遵循以下结构

代码语言:javascript
复制
int cpid = fork( );

if (cpid = = 0) 
{   
  //child code

  exec(foo);

  exit(0);    
}

//parent code

wait(cpid);

// end

(在exec调用unix内核清除子进程的文本、数据、堆栈并填充foo进程相关的文本/数据后),因此子进程使用不同的代码(foo的代码{与父进程不同})

票数 31
EN

Stack Overflow用户

发布于 2009-10-31 11:54:59

它们一起用于创建新的子流程。首先,调用fork创建当前进程(子进程)的副本。然后,从子进程中调用exec,用新进程“替换”父进程的副本。

这个过程是这样的:

代码语言:javascript
复制
child = fork();  //Fork returns a PID for the parent process, or 0 for the child, or -1 for Fail

if (child < 0) {
    std::cout << "Failed to fork GUI process...Exiting" << std::endl;
    exit (-1);
} else if (child == 0) {       // This is the Child Process
    // Call one of the "exec" functions to create the child process
    execvp (argv[0], const_cast<char**>(argv));
} else {                       // This is the Parent Process
    //Continue executing parent process
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1653340

复制
相关文章

相似问题

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