Вызов execv после создания потока
Я очень плохо знаком с потоками, процессами, execv и т. Д. Я исследовал и обнаружил, что когда вы выполняете execv, он занимает пространство вызывающего процесса. Мне интересно, что происходит, когда вы создаете поток в main, а затем вызываете execv, сразу после потока (не до его завершения, а сразу после создания потока). Я знаю, что execv заменит основной, но означает ли это, что он также заменит поток, или поток сможет выполняться и завершаться как обычно?
Небольшой пример того, что я спрашиваю:
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
}
Я проверил это, и я испытал странное поведение, так как мой поток не будет завершен, поэтому я хочу знать, является ли это причиной этого
1 ответ
Все exec
функции заменяют весь процесс исполняемой программой. Все темы уничтожены.
Если вы хотите выполнить другую программу, не затрагивая текущий процесс, вы должны использовать fork()
сначала создать новый процесс, и вызвать execv()
в дочернем процессе. См. Безопасно ли разветвляться из потока? для некоторых предостережений, которые следует учитывать при использовании fork()
в многопоточной программе.