Литмир - Электронная Библиотека
Содержание  
A
A

bash neil@susel03:~/BLP4e/chapter03>

Вы видите несколько сеансов терминалов, запустивших командную оболочку bash и сеанс передачи файла, выполняющий программу

ftp
. Просмотрев каталог /proc, вы получите более подробную информацию о сеансе
ftp
.

В данном случае для ftp задан идентификатор процесса

9118
, поэтому вы должны заглянуть в каталог /proc/9118 для получения подробной информации о нем:

$ <b>ls -l /proc/9118</b>

total 0

0 dr-xr-xr-x 2 neil users 0 2007-05-20 07:43 attr

0 -r-------- 1 neil users 0 2007-05-20 07:43 auxv

0 -r--r--r-- 1 neil users 0 2007-05-20 07:35 cmdline

0 -r--r--r-- 1 neil users 0 2007-05-20 07:43 cpuset

0 lrvxrwxrwx 1 neil users 0 2007-05-20 07:43 cwd -&gt; /home/neil/BLP4e/chapter03

0 -r-------- 1 neil users 0 2007-05-20 07:43 environ

0 lrwxrwxrwx 1 neil users 0 2007-05-20 07:43 exe -&gt; /usr/bin/pftp

0 dr-x------ 2 neil users 0 2007-05-20 07:19 fd

0 -rw-r--r-- 1 neil users 0 2007-05-20 07:43 loginuid

0 -r--r--r-- 1 neil users 0 2007-05-20 07:43 maps

0 -rw------- 1 neil users 0 2007-05-20 07:43 mem

0 -r--r--r-- 1 neil users 0 2007-05-20 07:43 mounts

0 -r-------- 1 neil users 0 2007-05-20 07:43 mountstats

0 -rw-r--r-- 1 neil users 0 2007-05-20 07:43 oom_adj

0 -r--r--r-- 1 neil users 0 2007-05-20 07:43 oom_score

0 lrwxrwxrwx 1 neil users 0 2007-05-20 07:43 root -&gt; /

0 -rw------- 1 neil users 0 2007-05-20 07:43 seccomp

0 -r--r--r-- 1 neil users 0 2007-05-20 07:43 smaps

0 -r--r--r-- 1 neil users 0 2007-05-20 07:33 stat

0 -r--r--r-- 1 neil users 0 2007-05-20 07:43 statm

0 -r--r--r-- 1 neil users 0 2007-05-20 07:33 status

0 dr-xr-xr-x 3 neil users 0 2007-05-20 07:43 task

0 -r--r--r-- 1 neil users 0 2007-05-20 07:43 wchan

В данном перечне вы видите разные специальные файлы, способные сообщить вам, что происходит с процессом.

Можно сказать, что выполняется программа /usr/bin/pftp, и ее текущий рабочий каталог — home/neil/BLP4e/chapter03. Есть возможность прочитать другие файлы из этого каталога, чтобы увидеть командную строку, применяемую для запуска программы, а также ее окружение. Файлы cmdline и environ предоставляют эту информацию в виде последовательности нуль-терминированных строк, поэтому вам следует соблюдать осторожность при их просмотре. Более подробно окружение ОС Linux мы обсудим в главе 4.

$ <b>od -с /proc/9118/cmdline</b>

0000000 f  t  p \0  1  9  2  .  1  6  8  .  0  .  1  2

0000020 \0

0000021

Из полученного вывода видно, что

ftp
была запущена из командной строки
ftp 192.163.0.12
.

Подкаталог fd предоставляет информацию об открытых дескрипторах файлов, используемых процессом. Эти данные могут быть полезны при определении количества файлов, одновременно открытых программой. На каждый открытый дескриптор приходится один элемент; имя его соответствует номеру дескриптора. В нашем случае, как мы и ожидали, у программы

ftp
есть открытые дескрипторы 0, 1, 2 и 3. Они включают стандартные дескрипторы ввода, вывода и потока ошибок плюс подключение к удаленному серверу.

$ <b>ls /proc/9118/fd</b>

0 1 2 3

Более сложные приемы: fcntl и mmap

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

fcntl

Системный вызов

fcntl
предоставляет дополнительные методы обработки низкоуровневых дескрипторов файлов:

<b>#include &lt;fcntl.h&gt;</b>

<b>int fcntl(int fildes, int cmd);</b>

<b>int fcntl(int fildes, int cmd, long arg);</b>

С помощью системного вызова

fcntl
вы можете выполнить несколько разнородных операций над открытыми дескрипторами файлов, включая их дублирование, получение и установку флагов дескрипторов файлов, получение и установку флагов состояния файла и управление блокировкой файла (advisory file locking).

Различные операции выбираются разными значениями параметра команды

cmd
, как определено в файле fcntl.h. В зависимости от выбранной команды системному вызову может потребоваться третий параметр
arg
.

fcntl(fildes, F_DUPFD, newfd)
— этот вызов возвращает новый дескриптор файла с числовым значением, равным или большим целочисленного параметра
newfd
. Новый дескриптор — копия дескриптора
fildes
. В зависимости от числа открытых файлов и значения
newfd
этот вызов может быть практически таким же, как вызов
dup(fildes)
.

fcntl(fildes, F_GETFD)
— этот вызов возвращает флаги дескриптора файла, как определено в файле fcntl.h. К ним относится
FD_CLOEXEC
, определяющий, закрыт ли дескриптор файла после успешного вызова одного из системных вызовов семейства exec.

fcntl(fildes, F_SETFD, flags)
— этот вызов применяется для установки флагов дескриптора файла, как правило, только
FD_CLOEXEC
.

fcntl(fildes, F_GETFL)
и
fcntl(fildes, F_SETFL, flags)
— эти вызовы применяются, соответственно, для получения и установки флагов состояния файла и режимов доступа. Вы можете извлечь режимы доступа к файлу с помощью маски
O_ACCMODE
, определенной в файле fcntl.h. Остальные флаги включают передаваемые значения в третьем аргументе вызову open с использованием
O_CREAT
. Учтите, что вы не можете задать все флаги. В частности, нельзя задать права доступа к файлу с помощью вызова fcntl.

61
{"b":"285844","o":1}