Читать «UNIX: взаимодействие процессов» онлайн - страница 325
Уильям Ричард Стивенс
Указатель
Поток может быть завершен двумя другими способами:
■ начальная функция потока (третий аргумент pthread_create) может вызвать return. Поскольку эта функция должна объявляться как возвращающая указатель на тип void, это возвращаемое значение становится статусом завершения потока;
■ функция main процесса может завершить работу или один из потоков может вызвать exit или _exit. При этом процесс завершает работу немедленно, вместе со всеми своими потоками.
ПРИЛОЖЕНИЕ В
Вспомогательные исходные коды
В.1. Заголовочный файл unpipc.h
Почти все программы книги подключают заголовочный файл unpipc.h, приведенный в листинге В.1. Он подключает все стандартные системные заголовки, нужные большинству пpoгрaмм для работы с сетью, вместе с некоторыми общими системными заголовками. Он также определяет константы типа MAXLINE и прототипы функций ANSI С для функций, определенных в тексте (типа px_ipc_name), и для всех используемых в книге оберток. Мы не приводим эти прототипы.
Листинг В.1. Заголовочный файл unpipc.h
//lib/unpipc.h
1 /* Наш заголовочный файл. */
2 #ifndef __unpipc_h
3 #define __unpipc_h
4 #include "../config.h" /* параметры конфигурации ОС */
5 /* "../config.h" создается сценарием configure */
6 /* изменяя список директив #include, нужно изменять файлы
7 ../aclocal.m4 и ../configure.in. чтобы работал сценарий configure */
8 #include <sys/types.h> /* базовые типы данных */
9 #include <sys/time.h> /* структура timeval{} для select() */
10 #include <time.h> /* timespec{} для pselect() */
11 #include <errno.h>
12 #include <fcntl.h> /* отключение блокировки */
13 #include <limits.h> /* PIPE_BUF */
14 #include <signal.h>
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <string.h>
18 #include <sys/stat.h> /* константы режима доступа к файлу S_xxx */
19 #include <unistd.h>
20 #include <sys/wait.h>
21 #ifdef HAVE_MQUEUE_H
22 #include <mqueue.h> /* очереди сообщений Posix */
23 #endif
24 #ifdef HAVE_SEMAPHORE_H
25 #include <semaphore.h> /* семафоры Posix */
26 #ifndef SEM_FAILED
27 #define SEM_FAILED ((sem_t *)(-1))
28 #endif
29 #endif
30 #ifdef HAVE_SYS_MMAN_H
31 #include <sys/mman.h> /* разделяемая память Posix */
32 #endif
33 #ifndef MAP_FAILED
34 #define MAP_FAILED ((void *)(-1))
35 #endif
36 #ifdef HAVE_SYS_IPC_H
37 #include <sys/ipc.h> /* System V IPC */
38 #endif
39 #ifdef HAVE_SYS_MSG_H
40 #include <sys/msg.h> /* очереди сообщений System V */
41 #endif
42 #ifdef HAVE_SYS_SEM_H
43 #ifdef __bsdi__
44 #undef HAVE_SYS_SEM_H /* тонкий момент: прототип semctl() в BSDI's содержит ошибки*/
45 #else
46 #include <sys/sem.h> /* семафоры System V */
47 #endif
48 #ifndef HAVE_SEMUN_UNION /* $$.It semun$$ */
49 union semun { /* определение объединения для semctl() */