Чтение онлайн

ЖАНРЫ

UNIX: разработка сетевых приложений
Шрифт:

solaris % lsof -i TCP:daytime

COMMAND PID USER FD TYPE DEVICE SIZE/OFF INODE NAME

inetd 222 root 15u inet 0xf5a801f8 0t0 TCP *:daytime

В выводе приводятся следующие данные: команда (данный сервис обеспечивается сервером

inetd
), идентификатор процесса, владелец процесса, дескриптор (15 и u означает, что он открыт на чтение и на запись), тип сокета, адрес протокола блока управления, размер смещения файла (не имеет значения для сокета), тип протокола и имя.

Еще один из

традиционных случаев применения данной программы имеет место, когда мы запускаем сервер, который связывает свой заранее известный порт и получает ошибку, указывающую, что адрес уже используется. Тогда мы запускаем программу
lsof
, чтобы выяснить, каким процессом используется данный порт.

Поскольку программа

lsof
сообщает об открытых файлах, она не может сообщать о точках доступа, не ассоциированных с открытым файлом, то есть точках доступа TCP в состоянии TIME_WAIT.

ПРИМЕЧАНИЕ

Программа находится по адресу ftp://vic.cc.purdue.edu/pub/tools/unix/lsof. Она написана Виком Абелем (Vic Abell).

Некоторые поставщики предлагают свои программы с похожими возможностями. Например, в BSD/OS предлагается программа fstat. Однако программа lsof работает под множеством версий Unix, а использование одного инструмента в неоднородном окружении вместо подбора различных средств для каждой среды является большим преимуществом.

Приложение Г

Различные исходные коды

Г.1. Заголовочный файл unp.h

Почти каждая программа в этой книге начинается с подключения заголовочного файла

unp.h
, показанного в листинге Г.1 [1] . Этот файл подключает все стандартные системные заголовочные файлы, необходимые для работы большинства программ, а также некоторые общие системные заголовочные файлы. В нем также определены такие константы, как
MAXLINE
, прототипы функций ANSI С для тех функций, которые мы определяем в тексте (например,
readline
), и все используемые нами функции-обёртки. Сами прототипы в приведенном ниже листинге мы не показываем.

1

Все исходные коды программ, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com.

Листинг Г.1. Заголовочный файл unp.h

//lib/unp.h

1 /* Наш собственный заголовочный файл */

2 #ifndef __unp_h

3 #define __unp_h

4 #include "../config.h" /* параметры конфигурации для данной ОС */

5 /* "../config.h" генерируется сценарием configure */

6 /* изменив список директив #include,

7 нужно также изменить файл acsite.m4 */

8 #include <sys/types.h> /*
основные системные типы данных */

9 #include <sys/socket.h> /* основные определения сокетов */

10 #include <sys/time.h> /* структура timeval{} для функции select */

11 #include <time.h> /* структура timespec{} для функции pselect */

12 #include <netinet/in.h> /* структура sockaddr_in{} и другие сетевые

определения */

13 #include <arpa/inet.h> /* inet(3) функции */

14 #include <errno.h>

15 #include <fcntl.h> /* для неблокируемых сокетов */

16 #include <netdb.h>

17 #include <signal.h>

18 #include <stdio.h>

19 #include <stdlib.h>

20 #include <string.h>

21 #include <sys/stat.h> /* для констант S_xxx */

22 #include <sys/uio.h> /* для структуры iovec{} и ready/writev */

23 #include <unistd.h>

24 #include <sys/wait.h>

25 #include <sys/un.h> /* для доменных сокетов Unix */

26 #ifdef HAVE_SYS_SELECT_H

27 #include <sys/select.h> /* для удобства */

28 #endif

29 #ifdef HAVE_SYS_SYSCTL_H

30 #include <sys/sysctl.h>

31 #endif

32 #ifdef HAVE_POLL_H

33 #include <poll.h> /* для удобства */

34 #endif

35 #ifdef HAVE_SYS_EVENT_H

36 #include <sys/event.h> /* для kqueue */

37 #endif

38 #ifdef HAVE_STRINGS_H

39 #include <strings.h> /* для удобства */

40 #endif

41 /* Три заголовочных файла обычно нужны для вызова ioctl

42 для сокета/файла: <sys/ioctl.h>, <sys/filio.h>,

43 <sys/sockio.h> */

44 #ifdef HAVE_SYS_IOCTL_H

45 #include <sys/ioctl.h>

46 #endif

47 #ifdef HAVE_SYS_FILIO_H

Поделиться с друзьями: