⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lc_sem.c

📁 open source for car navigation in linux
💻 C
字号:
/* * Copyright (C) 2002 Ricardo Arroyo <ricardo.arroyo@eresmas.net> * * This code may be used under the terms of Version 2 of the GPL, * read the file COPYING for details. * */#include <stdio.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include "lc_debug.h"#include "lc_sem.h"/*__________________________________________________________________________*//* FUNCTION                iCreateSem (key_t SemKey)                        *//* DESCRIPTION             Creates and unblocks a semaphore with key SemKey *//*			                                                    *//* INPUT PARAMETERS        semKey       Key                                 *//*                                                                          *//* OUTPUT PARAMETERS       sem_id (semaphore identifier) or -1 in error     *//* 			                                                    *//*__________________________________________________________________________*/int iCreateSem(key_t SemKey){int sem_id;struct sembuf sops;   if ((sem_id = semget(SemKey, 1, 0666 | IPC_CREAT)) == -1)   {      fprintf(stderr,"iCreateSem/semget : Key = %d, errno = %d, %s\n",SemKey, errno, strerror(errno));      sem_id = -1;   }   // unblocks semaphore incrementing value   sops.sem_num = 0;   sops.sem_op = 1;   sops.sem_flg = 0;   if (semop(sem_id, &sops, 1) == -1)   {      fprintf(stderr,"iCreateSem/unlock : sem_id = %d, errno = %d, %s\n",sem_id, errno, strerror(errno));      sem_id = -1;   }   if (iDebug & DEP_SEM)   {      fprintf(stderr,"iCreateSem : sem_id = %d, Key = %d\n",sem_id, SemKey);   }   return(sem_id);}/*__________________________________________________________________________*//* FUNCTION                iAssignSem (key_t SemKey)                        *//* DESCRIPTION             Assigns a semaphore identified by key SemKey     *//*			                                                    *//* INPUT PARAMETERS        semKey       Key                                 *//*                                                                          *//* OUTPUT PARAMETERS       sem_id (semaphore identifier) or -1 in error     *//* 			                                                    *//*__________________________________________________________________________*/int iAssignSem(key_t SemKey){int sem_id;   if ((sem_id = semget(SemKey, 1, 0666)) == -1)   {      fprintf(stderr,"iAssignSem/semget : Key = %d, errno = %d, %s\n",SemKey, errno, strerror(errno));      sem_id = -1;   }   if (iDebug & DEP_SEM)   {      fprintf(stderr,"iAssignSem : sem_id = %d, Key = %d\n",sem_id, SemKey);   }   return(sem_id);}/*__________________________________________________________________________*//* FUNCTION                iUnlockSem (int sem_id)                          *//* DESCRIPTION             Unlocks a semaphore                              *//*			                                                    *//* INPUT PARAMETERS        sem_id: semaphore identifier                     *//*                                                                          *//* OUTPUT PARAMETERS       0: OK, -1 error                                  *//* 			                                                    *//*__________________________________________________________________________*/int iUnlockSem(int sem_id){int iRetValue; // return valuestruct sembuf sops; // semaphore operatios structureint res;   sops.sem_num = 0;   sops.sem_op = 1; // unlocks semaphore   sops.sem_flg = SEM_UNDO; //undo if process terminates or dies   if ((res = semop(sem_id, &sops, 1)) == -1)   {      fprintf(stderr,"iUnlockSem : sem_id = %d, errno = %d, %s\n",sem_id, errno, strerror(errno));      iRetValue = -1;   }   else   {      iRetValue = 0;   }   if (iDebug & DEP_SEM)   {      fprintf(stderr,"iUnlockSem : sem_id = %d res = %d\n",sem_id,res);   }   return(iRetValue);}/*__________________________________________________________________________*//* FUNCTION                iLockSem (int sem_id)                            *//* DESCRIPTION             Locks a semaphore                                *//*			                                                    *//* INPUT PARAMETERS        sem_id: semaphore identifier                     *//*                                                                          *//* OUTPUT PARAMETERS       0: OK, -1 error                                  *//* 			                                                    *//*__________________________________________________________________________*/int iLockSem(int sem_id){int iRetValue; // return valuestruct sembuf sops; // semaphore operatios structureint res;   sops.sem_num = 0;   sops.sem_op = -1; // locks semaphore and wait if locked   sops.sem_flg = SEM_UNDO; //undo if process terminates or dies   if ((res = semop(sem_id, &sops, 1)) == -1)   {      fprintf(stderr,"iLockSem : sem_id = %d, errno = %d, %s\n",sem_id, errno, strerror(errno));      iRetValue = -1;   }   else   {      iRetValue = 0;   }   if (iDebug & DEP_SEM)   {      fprintf(stderr,"iLockSem : sem_id = %d res = %d\n",sem_id,res);   }   return(iRetValue);}/*__________________________________________________________________________*//* FUNCTION                iDelSem (int sem_id)                             *//* DESCRIPTION             Destroys a semaphore                             *//*			                                                    *//* INPUT PARAMETERS        sem_id: semaphore identifier                     *//*                                                                          *//* OUTPUT PARAMETERS       0: OK, -1 error                                  *//* 			                                                    *//*__________________________________________________________________________*/int iDelSem(int sem_id){int	iRetValue;   if (semctl(sem_id,0,IPC_RMID) == -1)   {      fprintf(stderr,"iDelSem : sem_id = %d, errno = %d, %s\n",sem_id, errno, strerror(errno));      iRetValue = -1;   }   else   {      iRetValue = 0;   }   return(iRetValue);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -