Вам нужно знать, какой стек направлений растет на вашем процессоре, и вам нужно знать, какой конец стека вы должны передать clone ().
С man clone
:
Stacks grow downwards on all processors that run Linux (except the
HP PA processors), so child_stack usually points to the topmost
address of the memory space set up for the child stack.
Вы не передаете самый верхний адрес, вы передаете самый нижний адрес, и вы не (я предполагаю) на HP-PA.
Fix:
child_stack = (void **) malloc(16384) + 16384 / sizeof(*child_stack);
P.S. Я удивлен числом очевидно неправильных ответов здесь.
- Нет, закрыть из-за неверного дескриптора файла
не аварийно завершает работу в любом UNIX и
Существующая система Linux.
- Нет,
void*
против void**
не имеет никакого отношения к проблеме.
- Нет, вам не нужно указывать адрес do_something, компилятор сделает это автоматически для вас.
И, наконец, да: вызов close
, _exit
или любой другой подпрограммы libc в потоке clone()d
потенциально небезопасен, хотя здесь это не вызывает проблемы.