📄 outshm.h
字号:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "err_exit.h"
struct exchange {
char buf[BUFSIZ+80]; /* 需交换的数据*/
int seq; /* 客户填入的顺序号 */
};
/* 说明semun结构 */
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
void init_a_semaphore( int, int, int);
int get_sem_val( int, int);
int semaphore_P(int);
int semaphore_V(int);
/* 创建/打开共享存储段,连接它到用户地址空间,返回它在用户空间的地址 */
unsigned char *shminit(key_t key, int *shmid)
{
unsigned char *retval;
if((*shmid = shmget(key,sizeof(struct exchange),0666|IPC_CREAT))== -1)
err_exit("shmget");
if((retval = shmat(*shmid,(unsigned char *)0,0)) == (unsigned char *)-1 )
err_exit("shmmat");
return retval;
}
/* P操作--企图进入一关键区 */
int semaphore_P(int sem_id)
{
struct sembuf sb;
sb.sem_num = 0;
sb.sem_op = -1; /* P操作-信号量值减少 */
sb.sem_flg = SEM_UNDO; /* 如果死亡,解除信号量请求*/
if (semop(sem_id, &sb, 1) == -1){
fprintf(stderr,"semaphore_P failed\n");
return(0);
}
return(1);
}
/* V操作--离开关键区 */
int semaphore_V(int sem_id)
{
struct sembuf sb;
sb.sem_num = 0;
sb.sem_op = 1; /* V操作-信号量值增加 */
sb.sem_flg = SEM_UNDO; /* 如果死亡,解除信号量请求*/
if (semop(sem_id, &sb, 1) == -1){
fprintf(stderr,"semaphore_V failed\n");
return(0);
}
return(1);
}
/* 删除指定的信号量集合 */
int rm_semaphore(int sid)
{
return(semctl(sid, 0, IPC_RMID,0));
}
/* 给指定的信号量赋初值 */
void init_a_semaphore( int sid, int semnum, int initval)
{
union semun semopts;
semopts.val = initval;
semctl( sid, semnum, SETVAL, semopts);
}
/* 获得指定的信号量之值 */
int get_sem_val( int sid, int semnum )
{
return( semctl(sid, semnum, GETVAL, 0));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -