#c #process #fork #atexit
#c #процесс #форк #atexit
Вопрос:
Я пытаюсь понять следующий фрагмент кода
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
pid_t pid ;
unsigned int i=0;
pid=vfork();
switch(pid)
{
case -1: // some sort of error
puts("fork error");
break;
case 0: // the child process
while(i<100)
{
printf("%dn", i);
i ;
}
break;
default: //parent
while(i<1000)
{
printf("%dn", i);
i ;
}
break;
}
// _exit(0);
}
И, пожалуйста, не говорите мне, что vfork() плох и тому подобное.Я знаю, что это так, но то, что происходит именно в этом коде, вызывает такого рода ошибки .
Заранее спасибо
Ответ №1:
Неясно, что вы пытаетесь сделать или понять, но вот слегка отредактированная цитата из руководства:
Функция vfork() имеет тот же эффект, что и fork(2), за исключением того, что поведение не определено, если процесс, созданный vfork() либо
- изменяет любые данные, отличные от переменной типа pid_t, используемой для хранения возвращаемого значения из vfork()
- возвращает результат функции, в которой была вызвана vfork()
- вызывает любую другую функцию перед успешным вызовом _exit(2) или одной из функций семейства exec(3)
Вы выполняете как 1: i
, так и 3 printf("%dn", i)
. Чего бы вы ни ожидали, это не сработает.
В качестве примечания, vfork
это неплохо. Просто сложно, опасно, почти бесполезно и удалено из SUSv4.
Комментарии:
1. Он также выполняет (3), комментируя вызов
_exit
— когда main возвращает, он вызываетexit
not_exit
— и, вероятно, в этом и заключается его проблема с atexit2. Спасибо @ChrisDodd , в этом была загвоздка, я попытался прокомментировать весь код и прочее и обнаружил, что виноват exit . Он удаляет фрейм стека для вызова родительского
3. Но почему код выполняется до «999», а затем ошибка seg? Если запись активации удалена, как и переменная «i». Как, увеличивается ли она и ошибка кода, только когда основная функция от родительского элемента пытается вернуться. Мне не нужны никакие ссылки со страницы руководства и т. Д. Пожалуйста, объясните это с точки зрения операционных систем, например, причина сбоя после возврата main в parent заключается в том, что родительский элемент пытается вернуть и извлечь стек, но фрейм стека уже был извлечен дочерним элементом при возврате. Вот почему он прерывается.
4. Кто-нибудь может сказать мне, как отладить его с помощью gdb или чего-то еще, чтобы увидеть, что на самом деле происходит за экраном?