Linux进程通信之shared memory(共享内存)

共享内存的示意框图:

先写一个ser_shm.c:

#include"myutili.h"

int main()
{
    int shm_key = Ftok("myshm",0xff);
    //第二个参数(创建共享内存的大小)
    int shm_id = shmget(shm_key, 1024*1024, IPC_CREAT|IPC_EXCL|0755);
    if(shm_id == -1)
    {
        perror("shmget.");
        exit(1);
    }
    char *address = (char*)shmat(shm_id, NULL, 0);
    if((void*)address == (void*)-1)
    {
        perror("shmat.");
        shmctl(shm_id, IPC_RMID, 0);
        exit(1);
    }
    key_t sem_key = Ftok("mysem", 0xff);
    int sem_id = semget(sem_key, 2, IPC_CREAT|IPC_EXCL|0755);
    union semun info;
    info.val = 0;
    semctl(sem_id,0, SETALL, info);
    struct sembuf p ={0, -1, 0}, v = {1, 1,0};
    while(1)
    {
        printf("Ser: >");
        scanf("%s", address);
        semop(sem_id, &v, 1);
        semop(sem_id, &p, 1);
        printf("Cli: >%s\n ",address);
    }
    shmdt(address);
    shmctl(shm_id, IPC_RMID, 0);
    shmctl(sem_id, 0, IPC_RMID);
    return 0;
}

写一个cli_shm.c:

#include"myutili.h"

int main()
{
    int shm_key = Ftok("myshm",0xff);
    int shm_id = shmget(shm_key, 0, 0);
    if(shm_id == -1)
    {
        perror("shmget.");
        exit(1);
    }
    char *address = (char*)shmat(shm_id, NULL, 0);//NULL连接的地址由系统自动分配
    if((void*)address == (void*)-1)
    {
        perror("shmat.");
        exit(1);
    }
    key_t sem_key = Ftok("mysem",0xff);
    int sem_id = Semget(sem_key, 0, 0);
    struct sembuf p = {1, -1, 0}, v = {0, 1, 0};
    while(1)
    {
        semop(sem_id, &p, 1);
        printf("Ser: >%s\n",address);
        printf("Cli: >");
        scanf("%s", address);
        semop(sem_id, &v, 1);
    }
    shmdt(address);
    return 0;
}

用两个信号量以及p、v操作来同步服务器和客户端的共享内存示意图:

运行的检验:

运行的结果

用共享内存加信号量的方式简单实现的一种客户端和服务器端的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值