Листинг 10.18. Глобальные переменные и функция main
//pxsem/mycat2.c
1 #include "unpipc.h"
2 #define NBUFF 8
3 struct { /* общие данные */
4 struct {
5 char data[BUFFSIZE]; /* буфер */
6 ssize_t n; /* объем буфера */
7 } buff[NBUFF]; /* количество буферов */
8 sem_t mutex, nempty, nstored; /* семафоры, а не указатели */
9 } shared;
10 int fd; /* входной файл, копируемый в стандартный поток вывода */
11 void *produce(void *), *consume(void *);
12 int
13 main(int argc, char **argv)
14 {
15 pthread_t tid_produce, tid_consume;
16 if (argc != 2)
17 err_quit("usage: mycat2
18 fd = Open(argv[1], O_RDONLY);
19 /* инициализация трех семафоров */
20 Sem_init(&shared.mutex, 0, 1);
21 Sem_init(&shared.nempty, 0, NBUFF);
22 Sem_init(&shared.nstored, 0, 0);
23 /* один производитель, один потребитель */
24 Set_concurrency(2);
25 Pthread_create(&tid_produce, NULL, produce, NULL); /* reader thread */
26 Pthread_create(&tid_consume, NULL, consume, NULL); /* writer thread */
27 Pthread_join(tid_produce, NULL);
28 Pthread_join(tid_consume, NULL);
29 Sem_destroy(&shared.mutex);
30 Sem_destroy(&shared.nempty);
31 Sem_destroy(&shared.nstored);
32 exit(0);
33 }