I have forgotten a precision.
In each thread, my software does a fork() followed by an execve(). If I
remove this fork(), I'm unable to reproduce this bug. Maybe sem_init()
returns an error when fork() is called form another thread.
That's beeing said, sem_init in librt is :
int
sem_init(sem_t *sem, int pshared, unsigned int value)
{
intptr_t semid;
int error;
if (_ksem_init(value, &semid) == -1)
return (-1);
if ((error = sem_alloc(value, semid, sem)) != 0) {
_ksem_destroy(semid);
errno = error;
return (-1);
}
return (0);
}
As errno contains an error, I suppose that sem_alloc() returns this
error, but sem_alloc() can only return ENOSPC or EINVAL...
Best regards,
JKB