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

Reply via email to