4

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

if(someVar == 1){
doSomeStuff;

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

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

4

3 回答 3

7

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

我认为您exec*fork功能感到困惑。这将拼接出一个新的子进程,它将运行与父进程相同的代码。

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

于 2009-03-18T14:22:33.847 回答
2

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

于 2009-03-18T14:21:58.667 回答
2

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

于 2009-03-18T14:22:22.003 回答