相同机器进程间通信-信号量

高效的进程间通信
共享内存 — 实时性最好

信号量

#include "io.h"
#include <sys/sem.h>


int init(int semnums, int value)
{
    key_t key = ftok("/etc", 100);
    int semid = -1;

    semid = semget(key, semnums, 0600 | IPC_CREAT | IPC_EXCL);
    if (semid < 0) {
        /*已经存在*/
        semid = semget(key, semnums, 0600);
        if (semid < 0) exit(0);
        return semid;

    }

    union semun {
        int val;
        struct semid_ds* buf;
        unsigned short * array;
    } va;
    va.array = (unsigned short *)calloc(semnums, sizeof(unsigned short));
    int i = 0;
    for (i  = 0; i < semnums; i++) {
        va.array[i] = value;
    }
    semctl(semid, semnums, SETALL, va);
    free(va.array);
    va.array = NULL;
    return semid;
}

void D(int semid)
{
    semctl(semid, 0, IPC_RMID);
}

int P(int semid, int nums, int val)/*-,dierge参数是第几个*/
{
    struct sembuf buf[1] = {
        {nums, -val, SEM_UNDO}
    };
    if (semop(semid, buf, 1) < 0) {
        fprintf(stderr, "semop + error:%s\n", strerror(errno));
        return -1;
    }
    return 0;
}

int V(int semid, int nums, int val)/*+*/
{
    struct sembuf buf[1] = {
        {0, +val, SEM_UNDO}
    };
    if (semop(semid, buf, sizeof(buf) / sizeof(struct(sembuf))) < 0) {
        fprintf(stderr, "semop - error:%s\n", strerror(errno));
        return -1;
    }
    return 0;
}

void display(int semid, int nums)
{
    union semun {
        int val;
        struct semid_ds* buf;
        unsigned short* array;
    } buffer;
    buffer.array = (unsigned short *) calloc (nums, sizeof(unsigned short));
    semctl(semid, nums, GETALL, buffer);
    int i = 0;
    for (i = 0; i < nums; i++) {
        printf("%d ", buffer.array[i]);
    }
    printf("\n");
    free(buffer.array);
    buffer.array = NULL;
    semctl(semid, nums, GETALL, buffer);

}

int main(int argc, char const *argv[])
{
    int sid = init(10, 1);
    display(sid, 10);
    P(sid, 4, 1);
    display(sid, 10);
    P(sid, 4, 1);
    D(sid);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值