В одном из особых случаев, показанных ниже, getpid()
для внука, созданного с помощью vfork()
, возвращает PID родительского процесса.
#include <stdio.h>
#include <stdlib.h>
int main() {
if(vfork()) { /* parent */
printf("parent pid = %d\n", getpid());
exit(0);
} else {
if(vfork()) { /* child */
printf("child pid = %d\n", getpid());
exit(0);
} else { /* grandchild */
printf("grandchild pid = %d\n", getpid());
exit(0);
}
}
}
Скомпилировано как gcc main.c
, это работает как ожидалось :
grandchild pid = 12241
child pid = 12240
parent pid = 12239
Скомпилировано как gcc main.c -lpthread
, неверный PID внука:
grandchild pid = 12431
child pid = 12432
parent pid = 12431
Есть какие-нибудь подсказки, почему? Это один из неопределенных случаев поведения?
С ps
и strace
я могу видеть правильный PID. Кстати, тот же пример кода хорошо работает с fork()
, то есть правильно getpid()
с или без -lpthread
.