Linux进程间通讯之信号量sem

本文介绍了一个使用信号量实现进程间共享内存存取同步的例子。通过创建信号量并定义锁和解锁操作,确保了多个子进程能正确地更新共享文件的内容,避免了并发访问带来的数据不一致问题。
信号量sem:
willisway1:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define NR  100
#define SIZE 1024
static int semid;
int sem_init(void)
{
    int arg;
    semid = semget(IPC_PRIVATE, 1, IPC_CREAT | 0600);
    arg = 1;
    semctl(semid, 0, SETVAL, arg);
    return 0;
}
int sem_destroy(void)
{
    return semctl(semid, 0, IPC_RMID);
}
int sem_lock(void)
{
    struct sembuf dec = {
                      .sem_num = 0,
                      .sem_op = -1,
                      .sem_flg = SEM_UNDO
                        };
    semop(semid, &dec, 1);
}
int sem_unlock(void)
{
    struct sembuf inc = {
                      .sem_num = 0,
                      .sem_op = 1,
                      .sem_flg = SEM_UNDO
                        };
    semop(semid, &inc, 1);
}
int main(void)
{
    pid_t pid;
    int i, ret;
    int fd, num;
    char buf[SIZE];
    sem_init();
    fd = open("./test", O_RDWR | O_CREAT, 0600);
    for (i = 0; i < NR; ++i)
    {
        pid = fork();
        if (pid == 0)
        {
            ret = sem_lock();
            lseek(fd, 0, SEEK_SET);
            ret = read(fd, buf, SIZE);
            usleep(1);
            buf[ret] = '/0';
            num = atoi(buf);
            num += 1;
            snprintf(buf, SIZE, "%d", num);
            lseek(fd, 0, SEEK_SET);
            usleep(1);
            ret = write(fd, buf, strlen(buf));
            fsync(fd);
            usleep(1);

            ret = sem_unlock();
            exit(0);
        }
    }
    for (i = 0; i < NR; ++i)
    {
        wait(NULL);
    }
    close(fd);
    sem_destroy();
    return 0;
}
分析:用于多个进程对于共享内存的存取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值