在execvp返回之后,为什么我的程序不会从它停止的地方开始?

时间:2009-03-18 14:18:08

标签: c multithreading execvp

我有一个像这样的代码块作为子线程运行:

if(someVar == 1){
doSomeStuff;

_exit(0)
}
else
   execvp(*(temp->_arguments), temp->_arguments);
printf("I'm done\n");

当我用someVar == 1运行程序时,我知道_exit(0)调用会杀死我的线程。但是,当它设置为0时,为什么程序在execvp()调用之后不继续并执行printf语句?

3 个答案:

答案 0 :(得分:7)

如果你exec*(调用exec系列中的任何exec函数),那么新程序的代码将被加载到当前进程中,并继续执行其主函数及其内容。在成功执行这些函数后,它们将永远不会返回,因为您的printf不再存在于内存中。

我认为您将exec*fork功能混淆了。这将拼接出一个新的子进程,该进程将运行与父进程相同的代码。

如果你想要的是创建一个与主线程共享数据和地址空间的新线程,你应该使用pthread_create函数。新进程不会共享数据,您必须使用其他机制(如管道或共享内存)与其他进程通信。

答案 1 :(得分:2)

除非发生错误,否则

execvp()会使用新的可执行文件覆盖您的程序并且不会返回。您首先需要fork(),然后在子进程上调用exec *。

答案 2 :(得分:2)

因为execvp 替换 运行的进程 exec 'ed。如果 execvp 返回,那是因为它失败了。否则不应该返回。