Читать «UNIX: взаимодействие процессов» онлайн - страница 325

Уильям Ричард Стивенс

Указатель status не должен быть установлен на локальный объект вызвавшего потока (типа автоматической переменной), поскольку этот объект уничтожается при завершении потока.

Поток может быть завершен двумя другими способами:

■ начальная функция потока (третий аргумент 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() */