LinuxForum.Fans
Тема

Как вернуть отрицательное значение semctl()

Автор: AYGO 5 сообщений 1173 просмотров
02.12.2025 05:59 #440075

Папки юниксоподобных операционных систем, к вам вопрос, как вернуть отрицательное значение из semctl(), как признак удачного завершения? Преподаватель из университета дал гробовое задание, не понимаю как решить.

02.12.2025 20:25 · отредактировано #440083
text
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, но давало ошибку при устанолении отрицательного значения, и может кто-то знает, какую идею хотя бы мне развить, возможно с флагами как нибудь поработать, можете хотя бы направить на путь. Есть конечно вариант в ядро залезть и там пошуршать, или перехватывать библиотеку и каким то образом изменить возвращаемое значение, но полюбому же есть какое то простое и элегантное решение, подступиться к которому мне не позволяют знания

03.12.2025 23:25 #440105

[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.
20.09.2026 20:10 #440291
AYGO написал:
как признак удачного завершения?

Вы хотели сказать Неудачного завершения.
Потому как это единственный способ вызвать отрицательное значение...

Войдите или зарегистрируйтесь, чтобы ответить.