#include <stdio.h>
#include <stdlib.h>
#include <sys/sem.h>
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo* __buf;
};
static struct sembuf g_sem_p = {0, -1, SEM_UNDO};
static struct sembuf g_sem_v = {0, 1, SEM_UNDO};
/*
semctl(int semid, int semnum, int cmd, union semun arg);
semnum: sem index
*/
int semaphore_setval(int sem_id, int val)
{
int ret;
union semun sem_union;
sem_union.val = val;
ret = semctl(sem_id,0,SETVAL,sem_union);
if(ret < 0)
{
return -1;
}
return 0;
}
int semaphore_getval(int sem_id)
{
int val;
val = semctl(sem_id,0,GETVAL,0);
//printf("%d\n", val);
if(val < 0)
{
return -1;
}
return val;
}
int semaphore_p(int sem_id)
{
if(semop(sem_id,&g_sem_p,1)==-1)
{
fprintf(stderr,"semaphore_p failed\n");
return -1;
}
return 0;
}
int semaphore_v(int sem_id)
{
if(semop(sem_id,&g_sem_v,1)==-1)
{
fprintf(stderr,"semaphore_v failed\n");
return -1;
}
return 0;
}
int semaphore_del(int sem_id)
{
return semctl(sem_id,0,IPC_RMID,0);
}
int semaphore_create(int key, int val)
{
int semid = semget((key_t)key, 1, 0666 | IPC_CREAT);
if (semid < 0)
{
printf("semget failed\n");
return -1;
}
if (semaphore_setval(semid, val) < 0)
{
semaphore_del(semid);
return -1;
}
return semid;
}
Linux信号量通用接口(进程同步)
最新推荐文章于 2023-09-24 12:24:41 发布
本文介绍了C/C++中使用semaphore进行进程同步的原理和关键函数,如semaphore_setval、semaphore_getval、semaphore_p和semaphore_v。通过semget和IPC_RMID操作创建和删除信号量,展示了如何在多线程环境下管理资源并发。
&spm=1001.2101.3001.5002&articleId=123533257&d=1&t=3&u=a5ddbf6a3fb349d2951617a3866550a5)
1万+

被折叠的 条评论
为什么被折叠?



