ошибка утверждения vfork () atexit

#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() либо

  1. изменяет любые данные, отличные от переменной типа pid_t, используемой для хранения возвращаемого значения из vfork()
  2. возвращает результат функции, в которой была вызвана vfork()
  3. вызывает любую другую функцию перед успешным вызовом _exit(2) или одной из функций семейства exec(3)

Вы выполняете как 1: i , так и 3 printf("%dn", i) . Чего бы вы ни ожидали, это не сработает.

В качестве примечания, vfork это неплохо. Просто сложно, опасно, почти бесполезно и удалено из SUSv4.

Комментарии:

1. Он также выполняет (3), комментируя вызов _exit — когда main возвращает, он вызывает exit not _exit — и, вероятно, в этом и заключается его проблема с atexit

2. Спасибо @ChrisDodd , в этом была загвоздка, я попытался прокомментировать весь код и прочее и обнаружил, что виноват exit . Он удаляет фрейм стека для вызова родительского

3. Но почему код выполняется до «999», а затем ошибка seg? Если запись активации удалена, как и переменная «i». Как, увеличивается ли она и ошибка кода, только когда основная функция от родительского элемента пытается вернуться. Мне не нужны никакие ссылки со страницы руководства и т. Д. Пожалуйста, объясните это с точки зрения операционных систем, например, причина сбоя после возврата main в parent заключается в том, что родительский элемент пытается вернуть и извлечь стек, но фрейм стека уже был извлечен дочерним элементом при возврате. Вот почему он прерывается.

4. Кто-нибудь может сказать мне, как отладить его с помощью gdb или чего-то еще, чтобы увидеть, что на самом деле происходит за экраном?