Глава 14
1. Нужно изменить только одну строку:
13с13
< id = Shmget(Ftok(argv[1], 0), 0, SVSHM_MORE);
…
> id = atol(argv[1]);
Мы легко могли бы изменить листинги 5.17 и 5.18, поскольку указатель cookie доступен функции my_thread (через структуру door_info_t), которая передает указатель на эту структуру создаваемому потоку (которому нужно знать дескриптор для вызова door_bind). 10. В этом примере атрибуты потока не меняются, поэтому их достаточно инициализировать лишь единожды (в функции main).Листинг Г.10. Использование указателя cookie для избавления от глобальных переменных
//doors/server9.c
1 #include "unpipc.h"
2 void
3 servproc(void *cookie, char *dataptr, size_t datasize,
4 door_desc_t *descptr, size_t ndesc)
5 {
6 long arg, result;
7 Door_revoke(*((int *) cookie));
8 arg = *((long *) dataptr);
9 printf("thread id %ld, arg = %ld\n", pr_thread_id(NULL), arg);
10 result = arg * arg;
11 Door_return((char *) &result, sizeof(result), NULL, 0);
12 }
13 int
14 main(int argc, char **argv)
15 {
16 int fd;
17 if (argc != 2)
18 err_quit("usage: server9
19 fd = Door_create(servproc, &fd, 0);
20 unlink(argv[1]);
21 Close(Open(argv[1], O_CREAT | O_RDWR, FILE MODE));
22 Fattach(fd, argv[1]);
23 for(;;)
24 pause();
25 }