> Блин, вы С учить будете? А то glibc, треды... придумали тоже... :) Буду рад, если Вы подскажите что почитать для получения новых знаний.
> У Вас указатель *stack ВСЕ ВРЕМЯ указывает на один и тот же
> сегмент,
> над которым затем трахаются по 10 копий malloc и free!!!
Мой код:
for (i=0; i<10; i++) {
void *stack = malloc(STACK_SIZE);
}
переменной stack присывается новое значение, так что *stack никак не может указывать на одинаковый сегмент памяти.
> Ниже я показал, что надо юзать указатель на указатель (можно массив указателей)
Кусок Вашего кода:
stack = malloc(STACK_SIZE);
for (i = 0; i < 10; i++) {
*stack = (void *)(STACK_SIZE + (char *)stack);
clone(func, stack, FLAGS, NULL);
Вы выделили память размером STACK_SIZE,
затем в первый байт записали ссылку на конец выделенной памяти
передали в clone ссылку на выделенную память.
У доке четко написано:
The child_stack argument specifies the location of the stack used by the child process. ... The calling process must therefore set up memory space for the child stack and pass a pointer to this space to clone().
В переводе это означает что передавать нужно ссылку на память, а не ссылку на ссылку на память.
Даже, если предположить что нужно передавать последнее, то Ваш код все равно не работает так как во все 10 клонов он передаст один и тот же указатель.
P.S. Ваш код я скомпилировал и запустил, как результат:
kernel: a.out[28746]: segfault at 0000000000000000 rip 0000000000000000 rsp 00002b18a9b79008 error 14