进程间交流信号灯

xiaoxiao2021-02-28  26

pv操作

/************************************************************************* > File Name: 1.sem.c > Author: zz > Mail: zzzkkk@outlook.com > Created Time: 2017年06月11日 星期日 11时21分06秒 ************************************************************************/ #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/sem.h> #include<sys/ipc.h> union semun { int val; /* Value for SETVAL */ struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ unsigned short *array; /* Array for GETALL, SETALL */ struct seminfo *__buf; /* Buffer for IPC_INFO (Linux specific) */ }; int semid; void sem_init(); void sem_p(); void sem_v(); void sem_delete(); int main(int argc, char *argv[]) { semid = semget((key_t)1234, 1, IPC_CREAT | 0666); if (-1 == semid) { perror("semget"); exit(1); } char ch = 'A'; if (argc > 1) { ch = 'B'; sem_init(); sleep(2); } int i; for (i = 0; i < 5; i++) { sem_p(); printf("%c", ch); fflush(stdout); sleep(1); printf("%c", ch); fflush(stdout); sleep(1); sem_v(); } sem_delete(); return 0; } void sem_init() { union semun sem; sem.val = 1; int ret = semctl(semid, 0, SETVAL, sem); if (-1 == ret) { perror("semctl"); } } void sem_p() { if (!is_exist()) { return; } struct sembuf buffer; buffer.sem_num = 0; buffer.sem_op = -1; buffer.sem_flg = SEM_UNDO; int ret = semop(semid, &buffer, 1); if (-1 == ret) { perror("p"); exit(3); } } void sem_v() { if (!is_exist()) { return; } struct sembuf buffer; buffer.sem_num = 0; buffer.sem_op = 1; buffer.sem_flg = SEM_UNDO; int ret = semop(semid, &buffer, 1); if (-1 == ret) { perror("v"); exit(3); } } void sem_delete() { if (!is_exist()) { return; } union semun sem; int ret = semctl(semid, 0, IPC_RMID, sem); if (-1 == ret) { perror("semctl"); exit(4); } } int is_exist() { union semun seminfo; struct seminfo info; seminfo.__buf = &info; int ret = semctl(semid, 0, SEM_INFO, seminfo); if (-1 == ret) { perror("semctl"); exit(4); } return info.semusz == 0 ? 0 : 1; }

转载请注明原文地址: https://www.6miu.com/read-250137.html

最新回复(0)