Основы программирования в Linux
bash [email protected]:~/BLP4e/chapter03>Вы видите несколько сеансов терминалов, запустивших командную оболочку bash и сеанс передачи файла, выполняющий программу
. Просмотрев каталог /proc, вы получите более подробную информацию о сеансеftp.ftpВ данном случае для ftp задан идентификатор процесса
, поэтому вы должны заглянуть в каталог /proc/9118 для получения подробной информации о нем:9118$ <b>ls -l /proc/9118</b>total 00 dr-xr-xr-x 2 neil users 0 2007-05-20 07:43 attr0 -r-------- 1 neil users 0 2007-05-20 07:43 auxv0 -r--r--r-- 1 neil users 0 2007-05-20 07:35 cmdline0 -r--r--r-- 1 neil users 0 2007-05-20 07:43 cpuset0 lrvxrwxrwx 1 neil users 0 2007-05-20 07:43 cwd -> /home/neil/BLP4e/chapter030 -r-------- 1 neil users 0 2007-05-20 07:43 environ0 lrwxrwxrwx 1 neil users 0 2007-05-20 07:43 exe -> /usr/bin/pftp0 dr-x------ 2 neil users 0 2007-05-20 07:19 fd0 -rw-r--r-- 1 neil users 0 2007-05-20 07:43 loginuid0 -r--r--r-- 1 neil users 0 2007-05-20 07:43 maps0 -rw------- 1 neil users 0 2007-05-20 07:43 mem0 -r--r--r-- 1 neil users 0 2007-05-20 07:43 mounts0 -r-------- 1 neil users 0 2007-05-20 07:43 mountstats0 -rw-r--r-- 1 neil users 0 2007-05-20 07:43 oom_adj0 -r--r--r-- 1 neil users 0 2007-05-20 07:43 oom_score0 lrwxrwxrwx 1 neil users 0 2007-05-20 07:43 root -> /0 -rw------- 1 neil users 0 2007-05-20 07:43 seccomp0 -r--r--r-- 1 neil users 0 2007-05-20 07:43 smaps0 -r--r--r-- 1 neil users 0 2007-05-20 07:33 stat0 -r--r--r-- 1 neil users 0 2007-05-20 07:43 statm0 -r--r--r-- 1 neil users 0 2007-05-20 07:33 status0 dr-xr-xr-x 3 neil users 0 2007-05-20 07:43 task0 -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 20000020 \00000021Из полученного вывода видно, что
была запущена из командной строкиftp.ftp 192.163.0.12Подкаталог fd предоставляет информацию об открытых дескрипторах файлов, используемых процессом. Эти данные могут быть полезны при определении количества файлов, одновременно открытых программой. На каждый открытый дескриптор приходится один элемент; имя его соответствует номеру дескриптора. В нашем случае, как мы и ожидали, у программы
есть открытые дескрипторы 0, 1, 2 и 3. Они включают стандартные дескрипторы ввода, вывода и потока ошибок плюс подключение к удаленному серверу.ftp$ <b>ls /proc/9118/fd</b>0 1 2 3Более сложные приемы: fcntl и mmap
Теперь мы коснемся приемов, которые вы можете пропустить, поскольку они редко используются. Признавая это, мы помещаем их в книгу просто для вашего сведения, потому что применение описываемых средств может предоставить простые решения для замысловатых проблем.
fcntl
Системный вызов
предоставляет дополнительные методы обработки низкоуровневых дескрипторов файлов:fcntl<b>#include <fcntl.h></b><b>int fcntl(int fildes, int cmd);</b><b>int fcntl(int fildes, int cmd, long arg);</b>С помощью системного вызова
вы можете выполнить несколько разнородных операций над открытыми дескрипторами файлов, включая их дублирование, получение и установку флагов дескрипторов файлов, получение и установку флагов состояния файла и управление блокировкой файла (advisory file locking).fcntlРазличные операции выбираются разными значениями параметра команды
, как определено в файле fcntl.h. В зависимости от выбранной команды системному вызову может потребоваться третий параметрcmd.arg□
— этот вызов возвращает новый дескриптор файла с числовым значением, равным или большим целочисленного параметраfcntl(fildes, F_DUPFD, newfd). Новый дескриптор — копия дескриптораnewfd. В зависимости от числа открытых файлов и значенияfildesэтот вызов может быть практически таким же, как вызовnewfd.dup(fildes)□
— этот вызов возвращает флаги дескриптора файла, как определено в файле fcntl.h. К ним относитсяfcntl(fildes, F_GETFD), определяющий, закрыт ли дескриптор файла после успешного вызова одного из системных вызовов семейства exec.FD_CLOEXEC□
— этот вызов применяется для установки флагов дескриптора файла, как правило, толькоfcntl(fildes, F_SETFD, flags).FD_CLOEXEC□
иfcntl(fildes, F_GETFL)— эти вызовы применяются, соответственно, для получения и установки флагов состояния файла и режимов доступа. Вы можете извлечь режимы доступа к файлу с помощью маскиfcntl(fildes, F_SETFL, flags), определенной в файле fcntl.h. Остальные флаги включают передаваемые значения в третьем аргументе вызову open с использованиемO_ACCMODE. Учтите, что вы не можете задать все флаги. В частности, нельзя задать права доступа к файлу с помощью вызова fcntl.O_CREAT