Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для Linux. ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 62

Автор ΠœΠ°Ρ€ΠΊ ΠœΠΈΡ‚Ρ‡Π΅Π»Π»

β–  Π€ΡƒΠ½ΠΊΡ†ΠΈΡ module_generate() Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ HTML-страницу с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ процСссов. Выводная информация Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ HTML-Π±Π»ΠΎΠΊ (пСрСмСнная page_start), строки с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ процСссах (ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ format_process_info()) ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ HTML-Π±Π»ΠΎΠΊ (пСрСмСнная page_end).

Ѐункция module_generate() опрСдСляСт ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ процСссов, провСряя содСрТимоС Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы /proc. Для получСния ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° списка ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ opendir() ΠΈ readdir() (описаны Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π‘, "НизкоуровнСвый Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄''). Из Π΄Π°Π½Π½ΠΎΠ³ΠΎ списка ΠΎΡ‚Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ элСмСнты, ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… состоят ΠΈΠ· ΠΎΠ΄Π½ΠΈΡ… Ρ†ΠΈΡ„Ρ€: это ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ процСссов.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ достаточно большоС число строк, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ запись ΠΈΡ… Π² сокСт с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ write() ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠΌΡƒ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡŽ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°. Для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ числа ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция writev() (описана Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π‘, "НизкоуровнСвый Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄"). Для Π½Π΅Π΅ создаСтся массив vec, состоящий ΠΈΠ· элСмСнтов Ρ‚ΠΈΠΏΠ° iovec. Π’Π°ΠΊ ΠΊΠ°ΠΊ число процСссов Π½Π΅ извСстно Π·Π°Ρ€Π°Π½Π΅Π΅ приходится Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ с малСнького массива ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости. Π’ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ vec_length содСрТится число ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… элСмСнтов массива vec, Π° Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ vec_size β€” число Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… элСмСнтов. Когда эти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ становятся ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ, Ρ€Π°Π·ΠΌΠ΅Ρ€ массива удваиваСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ xrealloc(). По ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с массивом ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ всС адрСсуСмыС Π² Π½Π΅ΠΌ строки, Π° Ρ‚Π°ΠΊΠΆΠ΅ сам массив.

11.4. Π Π°Π±ΠΎΡ‚Π° с сСрвСром

Если Π±Ρ‹ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ исходных тСкстов, ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π±Ρ‹ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GNU-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ Automake ΠΈ Autoconf. Но ΠΈΡ… рассмотрСниС Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ нашСй ΠΊΠ½ΠΈΠ³ΠΈ.

11.4.1. Π€Π°ΠΉΠ» Makefile

ВмСсто ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ Autoconf ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ простым Ρ„Π°ΠΉΠ»ΠΎΠΌ Makefile, совмСстимым с GNU-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ Make.[39] Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» упростит ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΡƒ сСрвСра ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ„Π°ΠΉΠ»Π° ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 11.10.

Листинг 11.10. (Makefile) Π€Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ сСрвСра

### ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ. ##############################################


# Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ компилятора языка Π‘.

CFLAGS = -Wall -g

# Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ сСрвСра.

SOURCES = server.c module.c common.c main.c

# Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹.

OBJECTS = $(SOURCES:.c=.o)

# БовмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ сСрвСрных ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.

MODULES = diskfree.so issue.so processes.so time.so


### ΠŸΡ€Π°Π²ΠΈΠ»Π°. ####################################################


# Π‘Π»ΡƒΠΆΠ΅Π±Π½Ρ‹ΠΉ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.

.PHONY: all clean


# Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ: компиляция всСх Ρ„Π°ΠΉΠ»ΠΎΠ².

all: server $(MODULES)


# Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ всСх ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

clean:

    rm -f $(OBJECTS) $(MODULES) server


# Главная сСрвСрная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π΄ΠΎΠ»ΠΆΠ½Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒΡΡ с Ρ„Π»Π°Π³Π°ΠΌΠΈ

# -Wl,-export-dynamic, Ρ‡Ρ‚ΠΎΠ±Ρ‹ динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΌΠΎΠ³Π»ΠΈ

# Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ символичСскиС константы. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅

# Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° libdl, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находятся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ динамичСской

# Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.

server: $(OBJECTS)

    $(CC) $(CFLAGS) Wl,-export-dynamic -ΠΎ [email protected] $^ -ldl


# ВсС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ сСрвСра зависят ΠΎΡ‚ Ρ„Π°ΠΉΠ»Π° server.h.

# Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ стандартноС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ·

# исходных Ρ„Π°ΠΉΠ»ΠΎΠ².

$(OBJECTS): server.h


# ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ создания совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈΠ·

# ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… исходных Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ с Ρ„Π»Π°Π³ΠΎΠΌ -fPIC ΠΈ

# Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ».

$(MODULES): \

%.so: %.c server.h

    $(CC) $(CFLAGS) -fPIC -shared -o [email protected] $<

Π’ Ρ„Π°ΠΉΠ»Π΅ Makefile Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ†Π΅Π»Π΅Π²Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ.

β–  ΠœΠΎΠ΄ΡƒΠ»ΡŒ all (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„Π°ΠΉΠ»Π° Makefile Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ стоит ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ) содСрТит исполняСмый Ρ„Π°ΠΉΠ» server ΠΈ всС сСрвСрныС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. ПослСдниС пСрСчислСны Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ MODULES.

β–  ΠœΠΎΠ΄ΡƒΠ»ΡŒ clean ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для удалСния всСх скомпилированных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

β–  ΠœΠΎΠ΄ΡƒΠ»ΡŒ server ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ исполняСмый Ρ„Π°ΠΉΠ» сСрвСра. ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΡƒΡŽΡ‚ΡΡ исходныС Ρ„Π°ΠΉΠ»Ρ‹, пСрСчислСнныС Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ SOURCES.

β–  ΠŸΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ прСдставляСт собой шаблон компиляции совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² сСрвСрных ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ исходныС Ρ„Π°ΠΉΠ»Ρ‹ сСрвСрных ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с Ρ„Π»Π°Π³ΠΎΠΌ -fPIC, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (см. Ρ€Π°Π·Π΄Π΅Π» 2.3.2, "БовмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ").

Π˜ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ» server компонуСтся с Ρ„Π»Π°Π³ΠΎΠΌ -Wl,-export-dynamic. Благодаря этому Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои символичСскиС константы, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹ΠΌ модулям ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, находящиСся Π² Ρ„Π°ΠΉΠ»Π΅ common.c.

11.4.2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сСрвСра

ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ исполняСмый Ρ„Π°ΠΉΠ» нСслоТно. ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, содСрТащий исходныС Ρ„Π°ΠΉΠ»Ρ‹, ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ make:

% make

cc -Wall -g -с -o server.о server.с

cc -Wall -g -с -o module.о module.с

cc -Wall -g -с -o common.о common.с

cc -Wall -g -с -o main.o main.c

cc -Wall -g -Wl,-export-dynamic -o server server.ΠΎ module.ΠΎ

 common.ΠΎ main.o -ldl

cc -Wall -g -fPIC -shared -o diskfree.so diskfree.c

cc -Wall -g -fPIC -shared -o issue.so issue.с

cc -Wall -g -fPIC -shared -o processes.so processes.с

cc -Wall -g -fPIC -shared -o time.so time.с

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄ΡƒΡ‚ созданы ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° server ΠΈ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ сСрвСрных ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ:

% ls -l server *.so

-rwxr-xr-x 1 samuel samuel 25769 Mar 11 01:15 diskfree.so

-rwxr-xr-x 1 samuel samuel 31184 Mar 11 01:15 issue.so

-rwxr-xr-x 1 samuel samuel 41579 Mar 11 01:15 processes.so

-rwxr-xr-x 1 samuel samuel 71758 Mar 11 01:15 server

-rwxr-xr-x 1 samuel samuel 13980 Mar 11 01:15 time.so

11.4.3. Запуск сСрвСра

Для запуска сСрвСра достаточно ввСсти Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС имя server. Если Π½Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΈ --port (-p). ОБ Linux ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ ΠΏΠΎΡ€Ρ‚. ΠŸΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ ΠΎΠΏΡ†ΠΈΠΈ --verbose (-v) сСрвСр ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡ€Ρ‚ Π΅ΠΌΡƒ Π½Π°Π·Π½Π°Ρ‡Π΅Π½.

Если Π½Π΅ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ сСрвСру адрСс с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΈ --address (-Π°), сСрвСр Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ запросы ΠΏΠΎ всСм ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΡΡ адрСсам. Для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊ сСти ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ любой ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ сСти, зная Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° сСрвСра ΠΈ имя страницы, смоТСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ сСрвСру. Из сообраТСний бСзопасности Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ адрСс localhost, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π½Π΅ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ сСрвСра. Π’ этом случаС сСрвСр Π±ΡƒΠ΄Π΅Ρ‚ связан с Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ сСтСвым устройством (обозначаСтся ΠΊΠ°ΠΊ lo) ΠΈ ΠΊ Π½Π΅ΠΌΡƒ смогут ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π½Π° Ρ‚ΠΎΠΌ ΠΆΠ΅ самом ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅.

% ./server --address localhost --port 4000

Π’Π΅ΠΏΠ΅Ρ€ΡŒ сСрвСр Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΎΠΊΠ½ΠΎ Π±Ρ€ΠΎΡƒΠ·Π΅Ρ€Π° ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ сСрвСру ΠΏΠΎ Π½ΠΎΠΌΠ΅Ρ€Ρƒ ΠΏΠΎΡ€Ρ‚Π°. ЗапроситС страницу, имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ совпадаСт с ΠΈΠΌΠ΅Π½Π΅ΠΌ модуля. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, вызываСтся ΠΌΠΎΠ΄ΡƒΠ»ΡŒ diskfree.so:

http://localhost:4000/diskfree

ВмСсто 4000 ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ сСрвСра, Π½Π°ΠΆΠΌΠΈΡ‚Π΅ <Ctrl+C>.

Если сСрвСр ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ запросы ΠΏΠΎ сСти, ΠΊ Π½Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±Ρ€ΠΎΡƒΠ·Π΅Ρ€Π°, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

httΡ€://host.domain.com:4000/diskfree

Если Π·Π°Π΄Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ --verbose (-v), сСрвСр ΠΏΡ€ΠΈ запускС ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ свою ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π° Π·Π°Ρ‚Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ IP-адрСс ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΊ Π½Π΅ΠΌΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Если ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Ρ‡Π΅Ρ€Π΅Π· интСрфСйс localhost, клиСнтский адрСс всСгда Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ 127.0.0.1.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΈ --module-dir (-m) ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ размСщСния сСрвСрных ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½ΠΈ находятся Ρ‚Π°ΠΌ ΠΆΠ΅, Π³Π΄Π΅ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° server.

Π’Π΅, ΠΊΡ‚ΠΎ Π·Π°Π±Ρ‹Π»ΠΈ ΠΈΠ»ΠΈ Π½Π΅ Π·Π½Π°ΡŽΡ‚ синтаксис ΠΎΠΏΡ†ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ server с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ --help (-h):

% ./server --help

Usage: ./server [ options ]

 -a, --address ADDR   Bind to local address (by default, bind

                      to all local addresses).

 -h, --help           Print this information.

 -m, --module-dir DIR Load modules from specified directory

                      (by default, use executable directory).

 -p, --port PORT      Bind to specified port.

 -v, --verbose        Print verbose messages.

11.5. ВмСсто эпилога

ΠŸΠ»Π°Π½ΠΈΡ€ΡƒΡ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Internet, Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ для Π½Π΅Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ. МногиС люди Π½Π΅ ΠΎΡΠΎΠ·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Ρ‚Π°ΠΊ ΠΆΠ΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΈ Π΄ΠΎΠ»Π³ΠΎ, ΠΊΠ°ΠΊ ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. ΠŸΡ€Π°Π²Π΄Π°, вопрос ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ β€” Ρ‚Π΅ΠΌΠ° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ, поэтому ΠΌΡ‹ лишь ΡƒΠΊΠ°ΠΆΠ΅ΠΌ, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π΅ΠΌΠ΅.