共享内存和信号灯集练习

#include <mystdio.h>

int main(int argc, const char *argv[])
{
    //创建key值
    key_t key = ftok("/home/ubuntu",2);
    if(key<0)
    {
        perror("ftok");
        return -1;
    }
    printf("key=%#x\n",key);
    //创建信号灯集
    int semid = semget(key,2,IPC_CREAT|0664);
    if(semid < 0)
    {
        perror("semget");
        return -1;
    }
    //设置信号灯值
    unsigned short brr[2] = {0,1};
    if(semctl(semid,0,SETALL,brr)<0)
    {
        perror("semctl");
        return -1;
    }
    //通过key值寻找共享内存
    int shmid = shmget(key,128,IPC_CREAT|0664);
    if(shmid<0)
    {
        perror("shmget");
        return -1;
    }
    printf("shmid=%#x\n",shmid);
    //将共享内存映射到用户空间
    void* adr = shmat(shmid,NULL,0);
    if((void*)-1 == adr)
    {
        perror("shmat");
        return -1;
    }
    printf("adr = %p\n",adr);

    char* ptr = (char*)adr;
    strcpy(ptr,"1234567");

    struct sembuf sop;
    while(1)
    {
        sop.sem_num = 1;
        sop.sem_op = -1;
        sop.sem_flg = 0;

        if(semop(semid,&sop,1) < 0)
        {
            perror("semop");
            return -1;
        }
        printf("%s\n",ptr);

        sop.sem_num = 0;
        sop.sem_op = +1;
        sop.sem_flg = 0;

        if(semop(semid,&sop,1) <0)
        {
            perror("semop");
            return -1;
        }
    }
    
    return 0;
}

#include <mystdio.h>


int main(int argc, const char *argv[])
{
    //找到key值
    key_t key = ftok("/home/ubuntu",2);
    if(key <0)
    {
        perror("ftok");
        return -1;
    }
    printf("key=%#x\n",key);
    //创建信号灯集
    int semid = semget(key,2,IPC_CREAT|0664);
    if(semid < 0)
    {
        perror("semget");
        return -1;
    }

    //通过key值寻找共享内存
    int shmid = shmget(key,128,IPC_CREAT|0664);
    if(shmid<0)
    {
        perror("shmget");
        return -1;
    }
    printf("shmid=%#x\n",shmid);
    //将共享内存映射到用户空间
    void* adr = shmat(shmid,NULL,0);
    if((void*)-1 == adr)
    {
        perror("shmat");
        return -1;
    }
    printf("adr = %p\n",adr);

    char* ptr = (char*)adr;
    char* start = NULL;
    char* end = NULL;

    char temp=0;
    struct sembuf sop;

    while(1)
    {
        sop.sem_num = 0;
        sop.sem_op = -1;
        sop.sem_flg = 0;

        if(semop(semid,&sop,1)<0)
        {
            perror("semop");
            return -1;
        }

        start = ptr;
        end = start + strlen(ptr)-1;

        while(start < end)
        {
            temp = *start;
            *start = *end;
            *end = temp;
            start++;
            end--;
        }

        sop.sem_num = 1;
        sop.sem_op = +1;
        sop.sem_flg = 0;
        if(semop(semid,&sop,1) < 0)
        {
            perror("semop");
            return -1;
        }
    }
    
    
    return 0;
}

相关推荐

  1. Linux内核--进程管理(十二)共享内存信号

    2024-04-22 03:14:01       47 阅读
  2. linux c多进程通信之共享内存信号

    2024-04-22 03:14:01       37 阅读
  3. linux内核原理-共享内存,信号

    2024-04-22 03:14:01       32 阅读
  4. python多线程多进程内存共享方式

    2024-04-22 03:14:01       53 阅读
  5. matlab多核程序如何共享内存数据

    2024-04-22 03:14:01       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 03:14:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 03:14:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 03:14:01       82 阅读
  4. Python语言-面向对象

    2024-04-22 03:14:01       91 阅读

热门阅读

  1. RocketMQ的设计理念和目标

    2024-04-22 03:14:01       35 阅读
  2. 数字滤波器的设计

    2024-04-22 03:14:01       32 阅读
  3. TRS: Transformers for Remote Sensing Scene Classification

    2024-04-22 03:14:01       32 阅读
  4. 【面经】4月9日 腾讯/csig/腾讯云/一面/1h30m

    2024-04-22 03:14:01       31 阅读
  5. LeetCode 3.无重复字符发最长字串

    2024-04-22 03:14:01       38 阅读
  6. 提高写作效率:ChatGPT写作攻略

    2024-04-22 03:14:01       39 阅读
  7. 修改Ubuntu的镜像源为清华镜像源

    2024-04-22 03:14:01       33 阅读
  8. lv_table

    2024-04-22 03:14:01       31 阅读
  9. 关于UAC标准音频数据传输端点的最大包长问题

    2024-04-22 03:14:01       36 阅读