Папки юниксоподобных операционных систем, к вам вопрос, как вернуть отрицательное значение из semctl(), как признак удачного завершения? Преподаватель из университета дал гробовое задание, не понимаю как решить.
Как вернуть отрицательное значение semctl()
int main() {
int semid = semget(IPC_PRIVATE, 2, 0666 | IPC_CREAT);
printf("semval =%d", semctl(semid, 0, GETVAL));
struct sembuf op;
op.sem_num = 0;
op.sem_op = -1;
op.sem_flg = 0;
semop(semid, &op, 1);
printf("semval = %d ",semctl(semid, 0, GETVAL));
semop(semid, &op, 1);
printf("semval = %d ",semctl(semid, 0, GETVAL));
semctl(semid, 0, IPC_RMID);
return 0;
}ну как я понял, самый вероятный вариант, сделать через операцию счетчика семафора, но столкнулся с етм, что семафор блокирует весь процесс, и как я понял в случае с счетчиком он не идет в минус, а увеличивается semzcnt, и система запоминает что надо будет заблокировать процесс, пытался установить значение счетчика через semcl, но давало ошибку при устанолении отрицательного значения, и может кто-то знает, какую идею хотя бы мне развить, возможно с флагами как нибудь поработать, можете хотя бы направить на путь. Есть конечно вариант в ядро залезть и там пошуршать, или перехватывать библиотеку и каким то образом изменить возвращаемое значение, но полюбому же есть какое то простое и элегантное решение, подступиться к которому мне не позволяют знания
[console=inline]man 3 semctl[/console]:
RETURN VALUE
If successful, the value returned by semctl() depends on cmd as follows:
GETVAL The value of semval.
GETPID The value of sempid.
GETNCNT The value of semncnt.
GETZCNT The value of semzcnt.
All others 0.
Otherwise, semctl() shall return -1 and set errno to indicate the error.
как признак удачного завершения?
Вы хотели сказать Неудачного завершения.
Потому как это единственный способ вызвать отрицательное значение...