[СИ] Стивенс. Не понимаю.
Язык СИ ОС UNIX
В книге «UNIX Взаимодействие процессов»
(русская, бумажная) приведена
упрощенная реализация очередей сообщений POSIX.
Параграф 5.8. Там используется контрольное число
MQI_MAGIC, определенное define-ом. Вот оно-то и
не понятно. Вот фрагменты этих функций:
Листинги 5.17 - 5.19.
7 mymqd_t
8 mymq_open(const char *pathname, int oflag, ...)
9 {
....
64 /* Выделение структуры mymq_info{ } для очереди */
65 if( (mqinfo = malloc(sizeof(struct mymq_hdr))) == NULL)
66 goto err;
67 mqinfo->mqi_hdr = mqhdr = (struct mymq_hdr *) mptr;
68 mqinfo->mqi_magic = MQI_MAGIC;
....
107 return((mymqd_t) mqinfo);
159 }
Листинг 5.20.
3 int
4 mymq_close(mymqd_t mqd)
5 {
....
11 if(mqinfo->mqi_magic != MQI_MAGIC){
12 errno = EBADF;
13 return(-1);
14 }
....
24 mqinfo->mqi_magic = 0; /* на всякий случай */
25 free(mqinfo);
26 return(0);
27 }
В функции mymq_open(); инициируется поле magic, а
во всех других функциях есть проверка, как в mymq_close();
То, что структура выделяется malloc-ом, я понимаю
так: структура должна существовать и при возврате
из mymq_open(), значит, локальная не годится.
Ну а что-же magic? От него-то какая польза?
Я думал, что это защита от ошибок программиста,
чтоб процесс не падал.
Но когда разобрался, то ничего не понял.
Я не тестил, теоретически разбирался.
Процессы не родственные (а хоть бы и родственные),
однопотоковые. Если всё написать правильно, то и без
magic все сработает хорошо. А если допустить ошибку,
то всё равно не поможет. Например, забыл написать
mqd = mymq_open(); и вызываю другие функции очереди.
Падение. Ошибочно дважды вызвал mymq_close(); Опять
падение. Ведь первый mymq_close(); освободит память,
а второй уже полезет в никуда (память-то уже освобождена).
В чем тут дело?
Кто знает прошу ответить.