文字列と数値を格納するためのLinux共有メモリ

参照

読んでください:Strcpyは送信中に実行されませんが、直接等式が実行されるため、文字列に正しい値を割り当てることができません

 

コード1:書かれているのはchar *、取り出されているのはintです

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <iostream>
#include <sys/shm.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
using namespace std;


#define ERR_EXIT(m) \
    do{\
        perror(m);\
        exit(1); \
    } while (0)

void sem_v(int semid)
{
    struct sembuf sops = { 0,1,0 };//默认阻塞
    int ret = semop(semid, &sops, 1);
    if (ret == -1)
    {
        ERR_EXIT("sem_v");
    }
}

void sem_p(int semid)
{
    struct sembuf sops = { 0,-1,0 };//默认阻塞
    int ret = semop(semid, &sops, 1);
    if (ret == -1)
    {
        ERR_EXIT("sem_p");
    }
}

int main()
{
    //前置服务器
    pid_t pid = fork();
    if (pid == 0)
    {
        //子进程从后置服务器取出数据
        int semid = semget(1234, 0, 0);// get a System V semaphore set identifier
        if (semid == -1)
        {

            semid = semget(1234, 1, IPC_CREAT | 0666);//打开失败创建
        }
        int shemid = shmget(1234, 1024, 0);//allocates a System V shared memory segment
        if (shemid == -1)
        {

            shemid = shmget(1234, 1024, IPC_CREAT | 0666);//打开失败创建
        }
        int* addr = (int*)shmat(shemid, NULL, 0);

        //从共享内存取数据
        sem_p(semid);
        int p = *addr;
        cout << "get value =" << p << endl;
    }
  

    //写数据进入到共享内存
    int semid2 = semget(1235, 0, 0);// get a System V semaphore set identifier
    if (semid2 == -1)
    {

        semid2 = semget(1235, 1, IPC_CREAT | 0666);//打开失败创建
    }
    int shemid2 = shmget(1235, 1024, 0);//allocates a System V shared memory segment
    if (shemid2 == -1)
    {
        shemid2 = shmget(1235, 1024, IPC_CREAT | 0666);//打开失败创建

    }
    char* shmptr2 = (char*)shmat(shemid2, NULL, 0);

    
    //shmptr2 = "nuhao";
    strcpy(shmptr2, "nuhao");
    sleep(5);
    sem_v(semid2);

    return 0;
}

 

コード2:char *を取り出し、intを書く

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <iostream>
#include <sys/shm.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
using namespace std;


#define ERR_EXIT(m) \
    do{\
        perror(m);\
        exit(1); \
    } while (0)

void sem_v(int semid)
{
    struct sembuf sops = { 0,1,0 };//默认阻塞
    int ret = semop(semid, &sops, 1);
    if (ret == -1)
    {
        ERR_EXIT("sem_v");
    }
}

void sem_p(int semid)
{
    struct sembuf sops = { 0,-1,0 };//默认阻塞
    int ret = semop(semid, &sops, 1);
    if (ret == -1)
    {
        ERR_EXIT("sem_p");
    }
}

int main()
{
    //后置服务器
    pid_t pid = fork();
    if (pid == 0)
    {
        //子进程从前置服务器取出数据
        int semid = semget(1235, 0, 0);// get a System V semaphore set identifier
        if (semid == -1)
        {

            semid = semget(1235, 1, IPC_CREAT | 0666);//打开失败创建
        }
        int shemid = shmget(1235, 1024, 0);//allocates a System V shared memory segment
        if (shemid == -1)
        {

            shemid = shmget(1235, 1024, IPC_CREAT | 0666);//打开失败创建
        }
        char* addr = (char*)shmat(shemid, NULL, 0);

        //从共享内存取数据
        sem_p(semid);
        //char p = *addr;
        cout << "get value =" << addr << endl;
    }


    //写数据发送给前置服务器
    int semid2 = semget(1234, 0, 0);// get a System V semaphore set identifier
    if (semid2 == -1)
    {

        semid2 = semget(1234, 1, IPC_CREAT | 0666);//打开失败创建
    }
    int shemid2 = shmget(1234, 1024, 0);//allocates a System V shared memory segment
    if (shemid2 == -1)
    {
        shemid2 = shmget(1234, 1024, IPC_CREAT | 0666);//打开失败创建

    }
    int* addr2 = (int*)shmat(shemid2, NULL, 0);


    *addr2 = 110;
    sleep(5);
    sem_v(semid2);

    return 0;
}

 

おすすめ

転載: blog.csdn.net/m0_49036370/article/details/114198978