semop () терпит неудачу при неудаче - PullRequest
0 голосов
/ 11 декабря 2011

Я пытаюсь написать программу на C ++, скомпилированную в GCC 4.6.1 на Ubuntu 11.10, и IPC доставляет мне немало хлопот. Чтобы продемонстрировать, вот мой код для обозначения семафора с уже предоставленными semid и semnum:

struct sembuf x;

x.sem_num = semnum;
x.sem_op = 1;
x.sem_flg = SEM_UNDO;
int old_value = semctl(semid, 0, GETVAL);
if(semop(semid, &x, 1) < 0)
{
    std::cerr << "semaphore failed to signal" << std::endl;
}
else if(semctl(semid, 0, GETVAL) == old_value)
{
    std::cerr << "signal returned OK, but didn't work" << std::endl;
}

Код для «ожидания» похож; главное отличие, конечно, в том, что sem_op установлен в -1. Иногда я получаю первое сообщение об ошибке здесь, но чаще всего я получаю второе, что для меня не имеет никакого смысла. Во-первых, я думаю, что я мог бы искать код ошибки (хотя я не уверен, зависит ли это от функций C ++ 11, которые я не должен использовать), но я понятия не имею, как даже начать обращаться к второй. Перезагрузка не сработала. GDB не сильно помогает, особенно когда «next» и «step», кажется, прыгают туда-сюда вместо того, чтобы идти вперед в последовательности.

...