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

📄 outshm.h

📁 SUN Solaris8平台下进程间通信
💻 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 + -