fork
和exec
之间的区别是什么
发布于 2009-10-31 11:51:59
fork()
将当前进程拆分为两个进程。或者换句话说,你的好的线性的容易想到的程序突然变成了运行一段代码的两个独立的程序:
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
在当前进程中执行目标可执行文件。
发布于 2013-05-22 11:23:38
Fork创建一个调用进程的副本。通常遵循以下结构
int cpid = fork( );
if (cpid = = 0)
{
//child code
exit(0);
}
//parent code
wait(cpid);
// end
(对于子进程text( code )、data、stack与调用进程相同)子进程执行if块中的代码。
EXEC用新进程的代码、数据、堆栈替换当前进程。通常遵循以下结构
int cpid = fork( );
if (cpid = = 0)
{
//child code
exec(foo);
exit(0);
}
//parent code
wait(cpid);
// end
(在exec调用unix内核清除子进程的文本、数据、堆栈并填充foo进程相关的文本/数据后),因此子进程使用不同的代码(foo的代码{与父进程不同})
发布于 2009-10-31 11:54:59
它们一起用于创建新的子流程。首先,调用fork
创建当前进程(子进程)的副本。然后,从子进程中调用exec
,用新进程“替换”父进程的副本。
这个过程是这样的:
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
}
https://stackoverflow.com/questions/1653340
复制相似问题