通过两个进程之间的共享内存发送 int

Sending int through shared memory between two processes

我想通过共享内存将一个 int 从一个进程发送到另一个进程。

我尝试简单地将 int 的值放入共享内存 (&number) - 没有用。

我厌倦了将字符串转换为字节转换为字符数组 (memcpy) 并从其他进程读取 sizeof(int) - 没用。

我厌倦了将 int 的值 memcpy 到一个 char 数组,将它发送到另一个进程,用 memcpy 将它复制回来:从 char 数组到一个 int - 没用

我最后一次尝试是这样的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h> // S_IRUSR

int main(int argc, char *argv[])
{
    pid_t gyerek;
    key_t kulcs;
    int oszt_mem_id;
    char *s;

    kulcs = ftok(argv[0], 1);
    oszt_mem_id = shmget(kulcs, 500, IPC_CREAT | S_IRUSR | S_IWUSR);

    s = shmat(oszt_mem_id, NULL, 0);

    gyerek = fork();

    if (gyerek == 0)
    {

        //printf("Child read this: %s\n", s);

        char szamarr[10];
        int szam = 12; 
        memcpy(&szamarr, &szam, sizeof(int)); 
        strcpy(s, szamarr);

        sleep(1);

        strcpy(s, &szam);
        
        sleep(3);
        shmdt(s);
    }
    else
    {
        sleep(2);
        int szam;
        char szamarr[10];
        memcpy(&szamarr, &s, sizeof(int));

        printf("Parent read this: %s\n", szamarr);

        sleep(1);

        int szam2 = (int) s;

        printf("Parent read this: %s\n", s);

        shmdt(s);

        wait(NULL);
        shmctl(oszt_mem_id, IPC_RMID, NULL);
    }
}

结果要么是一个随机数,要么什么都不是

如果你只想传递一个int,你不需要涉及字符串。但是一般来说,使用结构进行这种通信更容易:

typedef struct {
    int szam;
    // ...
} mystruct_t;


int main(int argc, char *argv[])
{
    pid_t gyerek;
    key_t kulcs;
    int oszt_mem_id;
    char *s;

    kulcs = ftok(argv[0], 1);
    oszt_mem_id = shmget(kulcs, sizeof(mystruct_t), IPC_CREAT | S_IRUSR | S_IWUSR);

    s = shmat(oszt_mem_id, NULL, 0);

    gyerek = fork();

    if (gyerek == 0)    // child
    {
        mystruct_t ms={0};
        ms.szam = 12;
        memcpy(s, &ms, sizeof(mystruct_t));
        sleep(3);
        shmdt(s);
    }
    else    // parent
    {
        sleep(1);
        mystruct_t ms={0};
        memcpy(&ms, s, sizeof(mystruct_t));
        printf("Parent read this: %d\n", ms.szam);
        shmdt(s);
        wait(NULL);
        shmctl(oszt_mem_id, IPC_RMID, NULL);
    }
}