Я хотел бы отправить int из одного процесса в другой через общую память.
Я попытался просто поместить значение int в разделяемую память (& число) - не сработало.
Я устал преобразовывать строку в байты в массив символов (memcpy) и читать sizeof(int) из другого процесса - не сработало.
я устал memcpy значение int в массив 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);
}
}
Результат либо случайное число, либо ничего
Удалите szamarr и перенесите напрямую между *s и szam, используя memcpy
@Gerhardh отчаянные времена требуют отчаянных мер - я пытался сделать все





Вам не нужно задействовать строки, если вы хотите передать только целое число. Однако, как правило, для такого рода коммуникации проще использовать структуры:
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);
}
}
strcpy(s, szamarr);Разметка памятиintне является строкой. Не используйтеstrcpy, чтобы скопировать его. Используйтеmemcpyтак же, как вы делали это всего одной строкой выше.