嵌入式学习day32

day31练习:

利用共享内存和信号灯实现两个进程对共享内存的同步操作(写一次、读一次)

write.c

#include "../head.h"

int main(void)
{
    key_t key;
    int shmid = 0;
    int semid = 0;
    char *pshmaddr = NULL;
    union semun myun;
    int ret = 0;
    struct sembuf mybuf;

    //ftok
    key = ftok("/", 'a');
    if (-1 == key)
    {
        perror("fail to ftok");
        return -1;
    }

    semid = semget(key, 2, IPC_CREAT | 0664);
    if (-1 == semid)
    {
        perror("fail to semget");
        return -1;
    }

    /* 读信号量初始化 */
    myun.val = 0;
    ret = semctl(semid, 0, SETVAL, myun);
    if (-1 == ret)
    {
        perror("fail to semctl");
        return -1;
    }

    /* 写信号量初始化 */
    myun.val = 1;
    ret = semctl(semid, 1, SETVAL, myun);
    if (-1 == ret)
    {
        perror("fail to semctl");
        return -1;
    }

    //shmget
    shmid = shmget(key, 4096, IPC_CREAT | 0664);
    if (-1 == shmid)
    {
        perror("fail to shmget");
        return -1;
    }

    //shmat
    pshmaddr = shmat(shmid, NULL, 0);
    if ((char *)-1 == pshmaddr)
    {
        perror("fail to shmat");
        return -1;
    }

    while (1)
    {
        /* 申请写资源 */
        mybuf.sem_num = 1;
        mybuf.sem_op = -1;
        mybuf.sem_flg = SEM_UNDO;

        ret = semop(semid, &mybuf, 1);
        if (-1 == ret)
        {
            perror("fail to semop");
            return -1;
        }

        fgets(pshmaddr, 4096, stdin);
        pshmaddr[strlen(pshmaddr)-1] = '\0';

        /* 释放读资源 */
        mybuf.sem_num = 0;
        mybuf.sem_op = +1;
        mybuf.sem_flg = SEM_UNDO;

        ret = semop(semid, &mybuf, 1);
        if (-1 == ret)
        {
            perror("fail to semop");
            return -1;
        }

        if (0 == strcmp(pshmaddr, ".quit"))
        {
            break;
        }
    }

    //shmdt
    shmdt(pshmaddr);

    //shmctl
    shmctl(shmid, IPC_RMID, NULL);

    semctl(semid, 0, IPC_RMID, NULL);

    return 0;
}

read.c

#include "../head.h"

int main(void)
{
    key_t key;
    int shmid = 0;
    int semid = 0;
    char *pshmaddr = NULL;
    union semun myun;
    int ret = 0;
    struct sembuf mybuf;

    //ftok
    key = ftok("/", 'a');
    if (-1 == key)
    {
        perror("fail to ftok");
        return -1;
    }

    semid = semget(key, 2, IPC_CREAT | 0664);
    if (-1 == semid)
    {
        perror("fail to semget");
        return -1;
    }

    /* 读信号量初始化 */
    myun.val = 0;
    ret = semctl(semid, 0, SETVAL, myun);
    if (-1 == ret)
    {
        perror("fail to semctl");
        return -1;
    }

    /* 写信号量初始化 */
    myun.val = 1;
    ret = semctl(semid, 1, SETVAL, myun);
    if (-1 == ret)
    {
        perror("fail to semctl");
        return -1;
    }

    //shmget
    shmid = shmget(key, 4096, IPC_CREAT | 0664);
    if (-1 == shmid)
    {
        perror("fail to shmget");
        return -1;
    }

    //shmat
    pshmaddr = shmat(shmid, NULL, 0);
    if ((char *)-1 == pshmaddr)
    {
        perror("fail to shmat");
        return -1;
    }

    while (1)
    {
        /* 申请读资源 */
        mybuf.sem_num = 0;
        mybuf.sem_op = -1;
        mybuf.sem_flg = SEM_UNDO;

        ret = semop(semid, &mybuf, 1);
        if (-1 == ret)
        {
            perror("fail to semop");
            return -1;
        }

        if (0 == strcmp(pshmaddr, ".quit"))
        {
            break;
        }

        printf("SHMADDR:%s\n", pshmaddr);

        /* 释放读资源 */
        mybuf.sem_num = 1;
        mybuf.sem_op = +1;
        mybuf.sem_flg = SEM_UNDO;

        ret = semop(semid, &mybuf, 1);
        if (-1 == ret)
        {
            perror("fail to semop");
            return -1;
        }
    }

    //shmdt
    shmdt(pshmaddr);

    //shmctl
    shmctl(shmid, IPC_RMID, NULL);

    semctl(semid, 0, IPC_RMID, NULL);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值