Найти размер разделяемой памяти в C shmget - PullRequest
0 голосов
/ 14 февраля 2020

Мне было интересно, возможно ли получить размер сегмента совместно используемой памяти в C, созданного из shmget, не имея размера сегмента как части данных? Я пытаюсь выделить динамический массив c int и мне нужно найти размер массива в дочернем процессе.

Основной процесс:

int sizeOfArray = 3;
int shm = shmget(IPC_PRIVATE, sizeof(int) * sizeOfArray, IPC_CREAT | 0666);
int *a = (int*) shmat(shm, NULL, 0);
a[0] = 0;
a[1] = 1;
a[2] = 2;
if (fork() == 0) {
    char *args[3];
    char shmID[11];
    bzero(shmID, 11);
    intToString(shm, shmID); // custom function that does what the name implies
    args[0] = "slave";
    args[1] = shmID;
    args[2] = NULL;
    execvp("slave", args);
    return -1;
}

wait(NULL);
shmdt((void*) a);
shmctl(shm, IPC_RMID, NULL);

Дочерний процесс (подчиненный) :

int shm = atoi(argv[1]);
int *ptr = (int*) shmat(shm, NULL, 0);
//TODO: find length of int array in shared memory
shmdt((void*) ptr);
return 0;

1 Ответ

0 голосов
/ 14 февраля 2020

Я обнаружил, что если вы используете shmctl и флаг IPC_STAT, вы можете получить количество байтов, выделенных сегменту разделяемой памяти. Затем вы можете просто разделить его на sizeof(int), чтобы получить размер вашего массива.

struct shmid_ds buf;
shmctl(shm, IPC_STAT, &buf);
int length = (int) buf.shm_segsz / sizeof(int);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...