Это упражнение в главе 8 «APUE» (упражнение 8.2, 2-е издание). Все упоминание:вызов функции vfork() в функции, сбитый с толку о результате
Напомним типичное расположение памяти на рисунке 7.6. Поскольку кадры стека , соответствующие каждому вызову функции, обычно хранятся в стеке, а потому, что после vfork ребенок запускается в адресном пространстве родителя, что произойдет, если вызов vfork осуществляется из функции, отличной от основной и ребенок выполняет возврат из этой функции после vfork ? Напишите тестовую программу, чтобы проверить это, и нарисуйте картину того, что происходит.
В моей программе:
static void f1(void), f2(void);
int main(void) {
printf("main address: %d\n", main);
f1();
f2();
_exit(0);
}
static void f1(void) {
printf("f1 address: %d\n", f1);
pid_t pid;
if ((pid = vfork()) < 0)
err_sys("vfork error");
}
static void f2(void) {
printf("f2 address: %d\n", f2);
char buf[1000];
int i;
for (i = 0; i < sizeof(buf); ++i)
buf[i] = 0;
}
я запустить программу, вывод:
main address: 4196560
f1 address: 4196604
f2 address: 4196663
f1 address: 4196604
[1] 12929 segmentation fault ./a.out
Я смущен о выходе.
- print
f1 address: xxx
, мы вызываем vfork(), сначала выполняется дочерний процесс. - печать
f2 address: xxx
, затем дочерние процессы вызывает _exit (0). - основной прогресс возвращается из f1(), кадр стека f1 был изменен на f2, это может привести к ошибке сегментации.
Но зачем печатать f1 address: 4196604
дважды и почему адрес f1 и f2 не одинаковый?
'buf' не инициализируется так' STRLEN (ЬиЕ) 'не определено поведение (и, вероятно, причиной Segfault). Это было намеренно? – rici
является vfork псевдоним fork() на вашей платформе? – hd1
@rici sizeof (buf) то же самое –