#include<stdio.h>
#include<unistd.h>
#include<sys/sem.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<stdlib.h>
union semun //man semctl
{
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 semget(key_t key,int nsems,int semflg);//创建信号量
// 关键字 信号个数 操作标志
int main()
{
key_t sem_key;
sem_key = ftok("mysem",0xff);//创建关键字
if(sem_key == -1)
{
perror("ftok");
exit(1);
}
else
{
printf("sem_key = 0x%x\n",sem_key); //以十六进制打印
}
int sem_id = semget(sem_key,2,IPC_CREAT|IPC_EXCL|0755);
if(sem_id == -1)
{
perror("semget");
exit(1);
}
else
{
printf("sem_id = %d\n",sem_id);
}
union semun init_val, init_val1;//初始化操作
init_val.val = 2;
init_val1.val = 3;
semctl(sem_id, 0, SETVAL, init_val);//删除信号集
semctl(sem_id, 1, SETVAL, init_val1);
struct sembuf op[2];
op[0].sem_num = 0;
op[0].sem_op = -1; //>0 ==0 <0
op[0].sem_flg = 0; //SEM_UNDO
op[1].sem_num = 1;
op[1].sem_op = -2;
op[1].sem_flg = 0;
semop(sem_id, op, 2);
int sem_val = semctl(sem_id, 0, GETVAL);
printf("sem_val = %d\n",sem_val);
sem_val = semctl(sem_id, 1, GETVAL);
printf ("sem_val1 = %d\n",sem_val);
return 0;
}
通信方式--信号量的操作
最新推荐文章于 2022-05-26 19:35:04 发布