vfork () ../ nptl / sysdeps / unix / sysv / linux / rise.c: нет такого файла или каталога

0

У меня проблема, когда я пытаюсь использовать vfork(). Вот код!

#include <stdio.h>
#include <unistd.h>

main()
{
    if(vfork() == 0)
    {
        printf("This is the child process\n");
    } else{
        printf("This is the parent process\n");
    }
}

и отладка с информацией об ошибке gdb:

(gdb) r
Starting program: /home/shawn/Documents/gcc/demo/./a.out 
This is the child process
This is the parent process
a.out: cxa_atexit.c:99: __new_exitfn: Assertion 'l != ((void *)0)' failed.

Program received signal SIGABRT, Aborted.
0x00007ffff7a48f77 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.

Может ли кто-нибудь помочь?

Я использую:

  • ubuntu 13.10 64-разрядная ОС
  • gcc версия 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu8)
  • 0
    Вы должны знать, как работает vfork и как его использовать. Посмотрите на это .
Теги:

2 ответа

1
Лучший ответ

Man для vfork(), говорит, что вы никогда не должны возвращаться от функции в дочернем элементе или вызывать exit() - вызывать либо _exit() либо одну из функций exec().

vfork() отличается от fork (2) тем, что вызывающий поток приостанавливается до тех пор, пока ребенок не завершит (либо нормально, вызывая _exit (2), либо ненормально, после доставки фатального сигнала), либо он вызывает вызов execve ( 2). До этого момента ребенок разделяет всю память со своим родителем, включая стек. Ребенок не должен возвращаться из текущей функции или вызывать exit (3), но может вызывать _exit (2).

Ошибка возникает после возврата с первого вызова printf.

  • 1
    ТКС, когда я в конце вызываю _exit (), все работает отлично!
5

Сообщение "нет такого файла" связано с тем, что у вас нет источника для библиотеки C. Я бы не стал беспокоиться об этом; вам редко приходится смотреть на это.

Крушение происходит потому, что вы злоупотребляете vfork. Единственными действительными действиями, которые вы можете сделать в дочернем процессе, является вызов execve или аналогичный, для замены процесса другой программой или вызов функции _exit (not exit) для выхода. Вы получаете неопределенное поведение, если ребенок пытается изменить любые данные, вернуться из функции, называемой vfork, или вызвать другую функцию.

Если вы хотите, чтобы ребенок был клоном родителя и мог продолжить работу с той же программой, используйте fork not vfork.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню