// Разделяемая память SystemV в Linux // Программа из учебника "Системное программирование в среде Linux", Гунько А.В., стр. 101 // Название: limits.c // Описание: оценка системных ограничений на разделяемую память //svshm/limits.c #include #include #include #include #include #define MAX_NIDS 4097 int main(int argc, char **argv) { int i, j, shmid[MAX_NIDS]; void *addr[MAX_NIDS]; unsigned long size; /*проверка макс. количества открываемых идентификаторов*/ for (i= 0; i <= MAX_NIDS; i++) { shmid[i] = shmget(IPC_PRIVATE, 1024, 0666 | IPC_CREAT); if (shmid[i] == -1) { printf("%d identifiers open at once\n", i); break; } } for (j = 0; j < i; j++) shmctl(shmid[j], IPC_RMID, NULL); /*определяем макс. количество подключаемых сегментов*/ for (i = 0; i <= MAX_NIDS; i++) { shmid[i]=shmget(IPC_PRIVATE, 1024, 0666 | IPC_CREAT); addr[i] = shmat(shmid[i], NULL, 0); if (addr[i] == (void *) -1) { printf("%d shared memory segments attached at once\n", i); shmctl(shmid[i], IPC_RMID, NULL); /*удаляем неудачно подключенный сегмент*/ break; } } for (j = 0; j < i; j++) { shmdt(addr[j]); shmctl(shmid[j], IPC_RMID, NULL); } /* проверка минимального размера сегмента */ for (size = 1; ; size++) { shmid[0] = shmget(IPC_PRIVATE, size, 0666 | IPC_CREAT); if (shmid[0] !=-1) { /* выход при успешном создании */ printf("minimum size of shared memory segment=%lu\n", size); shmctl(shmid[0], IPC_RMID, NULL); break; } } /* определение максимального размера сегмента */ for (size = 65536; ; size += 4096) { shmid[0] = shmget(IPC_PRIVATE, size, 0666 | IPC_CREAT); if (shmid[0] == -1) { /* выход при ошибке */ printf("max size of shared memory segment=%lu\n", size-4096); break; } shmctl(shmid[0], IPC_RMID, NULL); } exit(0); }