我对线程,进程,execv等都很陌生。我研究过并发现,当你执行execv时,它占用了调用进程的空间。我想知道当你在main中创建一个线程时会发生什么,然后在线程之后直接调用execv(不是在它完成之前,而是在创建线程之后)。我知道execv会替换main但这是否意味着它也会替换线程或线程是否能够像正常一样执行和完成?
我问的小例子:
int main(){
printf("hello from main!);
char *buffer = "some data";
if(pthread_creat(&mythreadpid, NULL, thread1, buffer){
printf("ERROR!!");
}
execv(...) //do execv here
}
void *thread1(void *buffer){
printf("calling from my thread!");
//do something else
}
我测试了这个并且我确实遇到了奇怪的行为,因为我的线程无法完成,所以我想知道这是否是它的原因
答案 0 :(得分:5)
所有exec
函数都用正在执行的程序替换整个过程。所有线程都被破坏了。
如果要在不影响当前进程的情况下执行其他程序,则应首先使用fork()
创建新进程,然后在子进程中调用execv()
。有关在多线程程序中使用fork()
时需要注意的注意事项,请参阅Is it safe to fork from within a thread?。