在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语句?
如果你exec*
(从exec系列中调用任何exec函数),那么新程序的代码将被加载到当前进程中,并继续执行其主函数及其内容。 在成功执行这些函数后,它们将永远不会返回,因为printf
不再存在于内存中。
我认为你将exec*
与fork
函数混淆了。 这将拼接一个新的子进程,它将运行与父进程相同的代码。
如果你想要的是创建一个新线程,它与主线程共享数据和地址空间,你应该使用pthread_create
函数。 新进程不会共享数据,您必须使用其他机制(如管道或共享内存)与其他进程通信。
除非发生错误,否则execvp()会使用新的可执行文件覆盖您的程序并且不会返回。 您需要先fork()然后在子进程上调用exec *。
因为execvp
用您执行的进程替换了您正在运行的进程。 如果execvp返回,那是因为它失败了。 否则不应该返回。