Книга: UNIX: разработка сетевых приложений
Сокеты ядра BSD
Сокеты ядра BSD
Мы начнем с FreeBSD, операционной системы с Беркли-ядром, в котором все функции сокетов являются системными вызовами. Программа трассировки системных вызовов имеет название ktrace
. Она выводит информацию о трассировке в файл (по умолчанию имя этого файла ktrace.out
), который можно вывести на экран с помощью kdump
. Клиент сокета запускается следующим образом:
freebsd % ktrace daytimetcpcli 192.168.42.2
Tue Aug 19 23:35.10 2003
Затем запускаем kdump
, чтобы направить трассировочную информацию в стандартный поток вывода.
3211 daytimetcpcli CALL socket(0x2,0x1,0)
3211 daytimetcpcli RET socket 3
3211 daytimetcpcli CALL connect(0x3,0x7fdffffe820,0x10)
3211 daytimetcpcli RET connect 0
3211 daytimetcpcli CALL read(0x3,0x7fdffffe830,0x1000)
3211 daytimetcpcli GIO fd 3 read 26 bytes
"Tue Aug 19 23:35:10 2003
"
3211 daytimetcpcli RET read 26/0x1a
...
3211 daytimetcpcli CALL write(0x1,0x204000,0x1a)
3211 daytimetcpcli GIO fd 1 wrote 26 bytes
"Tue Aug 19 23:35:10 2003
"
3211 daytimetcpcli RET write 26/0x1a
3211 daytimetcpcli CALL read(0x3,0x7fdffffe830,0x1000)
3211 daytimetcpcli GIO fd 3 read 0 bytes
""
3211 daytimetcpcli RET read 0
3211 daytimetcpcli CALL exit(0)
Число 3211 является идентификатором процесса. CALL
идентифицирует системный вызов, RET
обозначает возвращение управления, GIO
подразумевает общую операцию ввода-вывода. Мы видим системные вызовы socket
и connect
, за которыми следуют вызовы read
, возвращающие 26 байт. Наш клиент записывает эти байты в стандартный поток вывода, и при следующем вызове read
возвращает нулевое значение (конец файла).