20 mqid = Msgget(Ftok(argv[1], 0), MSG_R);
21 for(;;) {
22 /* блокируется в ожидании, извещает родительский процесс */
23 nread = Msgrcv(mqid, buff, MAXMSG, 0, 0);
24 Write(pipe2[1], &nread, sizeof(ssize_t));
25 /* ожидает разрешения родительского процесса */
26 if ((n = Read(pipe1[0], &c, 1)) != 1)
27 err_quit("child: read on pipe returned %d", n);
28 }
29 exit(0);
30 } /* $$.bp$$ */
31 /* parent */
32 Close(pipe1[0]);
33 Close(pipe2[1]);
34 FD_ZERO(&rset);
35 FD_SET(pipe2[0], &rset);
36 for(;;) {
37 if ((n = select(pipe2[0] + 1, &rset, NULL, NULL, NULL)) != 1)
38 err_sys("select returned %d", n);
39 if (FD_ISSET(pipe2[0], &rset)) {
40 n = Read(pipe2[0], &nread, sizeof(ssize_t)); /* *INDENT-OFF* */
41 if (n != sizeof(ssize_t))
42 err_quit("parent: read on pipe returned %d", n); /* *INDENT-ON* */
43 printf("read %d bytes, type = %ld\n", nread, buff->mtype);
44 Write(pipe1[1], &c, 1);
45 } else
47 }
46 err_quit("pipe2[0] not ready");
48 Kill(childpid, SIGTERM);
49 exit(0);
50 }
Глава 13
1. В листинге Г.8 приведен текст измененной версии листинга 12.6, а в листинге Г.9 — текст новой версии листинга 12.7. Обратите внимание, что в первой пpoгрaммe мы устанавливаем размер объекта вызовом ftruncate; lseek и write использовать для этого нельзя.
//pxshra/test1.c
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 int fd, i;
6 char *ptr;
7 size_t shmsize, mmapsize, pagesize;
8 if (argc != 4)
9 err_quit("usage: test1
10 shmsize = atoi(argv[2]);
11 mmapsize = atoi(argv[3]);
12 /* открываем shm: создание или урезание; установка размера */
13 fd = Shm_open(Px_ipc_name(argv[1]), O_RDWR | O_CREAT | O_TRUNC,
14 FILE_MODE);
15 Ftruncate(fd, shmsize); /* $$.bp$S */
16 ptr = Mmap(NULL, mmapsize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
17 Close(fd);
18 pagesize = Sysconf(_SC_PAGESIZE);
19 printf("PAGESIZE = %ld\n", (long) pagesize);
20 for (i = 0; i < max(shmsize, mmapsize); i += pagesize) {
21 printf("ptr[%d] = %d\n", i, ptr[i]);
22 ptr[i] = 1;
23 printf("ptr[%d] = %d\n", i + pagesize – 1, ptr[i + pagesize – 1]);
24 ptr[i + pagesize – 1] = 1;
25 }
26 printf("ptr[%d] =%d\n", i, ptr[i]);
27 exit(0);
28 }
//pxshm/test2.c
1 #include "unpipc.h"
2 #define FILE "test.data"
3 #define SIZE 32768
4 int
5 main(int argc, char **argv)
6 {
7 int fd, i;
8 char *ptr;
9 /* создаем или урезаем, отображаем */
10 fd = Shm_open(Px_ipc_name(FILE), O_RDWR | O_CREAT | O_TRUNC, FILE_MODE);
11 ptr = Mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
12 for (i = 4096; i <= SIZE; i += 4096) {