// Очереди сообщений SystemV в Linux // Программа из учебника "Системное программирование в среде Linux", Гунько А.В., стр. 92 // Название: limits.c // Описание: оценка системных ограничений на очереди //svmsg/limits.c #include #include #include #include #include #define MAX_DATA 64*1024 #define MAX_NMESG 4096 #define MAX_NIDS 4096 int max_mesg; struct mymesg { long type; char data[MAX_DATA]; } mesg; int main(int argc, char **argv) { int i, j, msqid, qid[MAX_NIDS]; /* определение максимального размера сообщения */ msqid = msgget(IPC_PRIVATE, IPC_CREAT), mesg.type = 1; for (i = MAX_DATA; i > 0; i -= 128) { if (msgsnd(msqid, &mesg, i, 0) == 0) { printf( "maximum amount of data per message = %d\n", i); max_mesg = i; break; } if (errno != EINVAL) { printf("msgsnd error for length %d\n", i); exit(-1); } } if (i == 0) { printf("i == 0\n"); exit(-2); } msgctl(msqid, IPC_RMID, NULL); /* количество сообщений в очереди */ mesg.type = 1; for (i = 8; i <= max_mesg; i *= 2) { msqid = msgget(IPC_PRIVATE, IPC_CREAT); for (j = 0; j < MAX_NMESG; j++) { if (msgsnd(msqid, &mesg, i, IPC_NOWAIT) != 0) { if (errno == EAGAIN) break; printf("msgsnd error, i = %d, j = %d\n", i, j); exit(-3); break; } } printf("%4d %4d-byte messages were placed onto queue.", j, i); printf(" %d bytes total\n", i*j); msgctl(msqid, IPC_RMID, NULL); } /* максимальное количество идентификаторов */ mesg.type = 1; for (i = 0; i <= MAX_NIDS; i++) { if ((qid[i]=msgget(IPC_PRIVATE,IPC_CREAT))==-1) { printf("%d identifiers open at once\n", i); break; } } for (j = 0; j < i; j++) msgctl(qid[j], IPC_RMID, NULL); exit(0); }