📄 sem_func.c
字号:
#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/stat.h>#include <errno.h>#include <unistd.h>#include <stdlib.h>#include <fcntl.h>#include <stdio.h>#include "sem_func.h"int init(int *id, unsigned int value, char *sem_ident){ int oflag, sem_id, i; union semun arg; struct semid_ds seminfo; oflag = SVSEM_MODE | IPC_CREAT | IPC_EXCL; if ( (sem_id = semget(ftok(sem_ident, 0), 1, oflag)) >= 0) { *id = sem_id; arg.val = value; semctl(*id, 0, SETVAL, arg); } else if (errno == EEXIST) { sem_id = semget(ftok(sem_ident, 0), 1, SVSEM_MODE); arg.buf = &seminfo; for (i = 0; i < 10; i++) { semctl(sem_id, 0, IPC_STAT, arg); if (arg.buf->sem_otime != 0) { return 0; } sleep(1); } printf("semget OK, but semaphore not initialized.\n"); exit(1); } else { printf("semget error.\n"); exit(1); } return 0;}int P(int *id){ struct sembuf op; op.sem_num = 0; op.sem_op = 1; op.sem_flg = 0; if (semop(*id, &op, 1) < 0) return (-1); return (0);}int V(int *id){ struct sembuf op; op.sem_num = 0; op.sem_op = -1; op.sem_flg = 0; if (semop(*id, &op, 1) < 0) return (-1); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -