Системный вызов gethostname(), являющийся противоположностью системного вызова sethostname(), извлекает имя хоста системы. Это имя можно также просмотреть и установить с помощью команды hostname(1) и характерного для Linux файла /proc/sys/kernel/hostname.

Системный вызов getdomainname(), будучи противоположностью системного вызова setdomainname(), извлекает доменное имя NIS. Это имя можно также просмотреть и установить с помощью команды domainname(1) и характерного для ОС Linux файла /proc/sys/kernel/domainname.

Системные вызовы sethostname() и setdomainname() довольно редко применяются в прикладных программах. Обычно имя хоста и доменное имя NIS устанавливаются в ходе загрузки системы сценариями ее запуска.

Программа из листинга 12.2 выводит информацию, возвращаемую системным вызовом uname(). Пример вывода, который можно увидеть при запуске этой программы, имеет следующий вид:

$ ./t_uname

Node name: tekapo

System name: Linux

Release: 2.6.30-default

Version: #3 SMP Fri Jul 17 10:25:0 °CEST 2009

Machine: i686

Domain name:

Листинг 12.2. Использование системного вызова uname()

sysinfo/t_uname.c

#define _GNU_SOURCE

#include

#include "tlpi_hdr.h"

int

main(int argc, char *argv[])

{

struct utsname uts;

if (uname(&uts) == -1)

errExit("uname");

printf("Node name: %s\n", uts.nodename);

printf("System name: %s\n", uts.sysname);

printf("Release: %s\n", uts.release);

printf("Version: %s\n", uts.version);

printf("Machine: %s\n", uts.machine);

#ifdef _GNU_SOURCE

printf("Domain name: %s\n", uts.domainname);

#endif

exit(EXIT_SUCCESS);

}

sysinfo/t_uname.c

12.3. Резюме

Файловая система /proc предоставляет прикладным программам ряд сведений о ядре. В каждом подкаталоге /proc/PID содержатся файлы и подкаталоги, предоставляющие информацию о процессе, чей идентификатор совпадает с PID. В других различных файлах и каталогах, находящихся в /proc, приводится общесистемная информация, которую программа может считать и в некоторых случаях изменить.

Системный вызов uname() позволяет нам уточнить реализацию UNIX и тип машины, на которой запущено приложение.

Дополнительная информация

Дополнительные сведения о файловой системе /proc можно найти на странице руководства proc(5), в исходном файле ядра Documentation/filesystems/proc.txt и в различных файлах из каталога Documentation/sysctl.

12.4. Упражнения

12.1. Напишите программу, выводящую список идентификаторов процессов и имен команд для всех процессов, запущенных пользователем, который указан в аргументе командной строки программы. (Для этого вам может пригодиться функция userIdFromName() из листинга 8.1.) Эту задачу можно выполнить, исследовав строки Name: и Uid: всех имеющихся в системе файлов /proc/PID/status. Сквозной просмотр всех имеющихся в системе каталогов /proc/PID требует задействования функции readdir(3), рассматриваемой в разделе 18.8. Обеспечьте возможность правильной обработки программой случаев исчезновения каталогов /proc/PID в период между обнаружением их существования и попыткой открытия соответствующего файла /proc/PID/status.

12.2. Напишите программу, выводящую на экран дерево, демонстрирующее иерархию родительско-дочерних отношений всех имеющихся в системе процессов, восходящую к init. Для каждого процесса программа должна вывести идентификатор процесса и выполняемую команду. Вывод программы должен быть похож на вывод команды pstree(1), хотя совсем не обязательно, чтобы он был таким же сложным. Родитель каждого имеющегося в системе процесса может быть определен путем изучения строки PPid: всех имеющихся в системе файлов /proc/PID/status. Внимательно отнеситесь к обработке возможности исчезновения родителя процесса (и соответственно его каталога /proc/PID) в ходе сканирования всех каталогов /proc/PID.

12.3. Напишите программу, выводящую список всех процессов, у которых имеется открытый файл с указанным путевым именем. Эту задачу можно выполнить, изучив содержимое всех символьных ссылок /proc/PID/fd/*. Для этого могут потребоваться вложенные циклы, использующие функцию readdir(3) для сканирования всех каталогов /proc/PID, а затем содержимого всех записей /proc/PID/fd внутри каждого каталога /proc/PID. Для чтения содержимого символьной ссылки /proc/PID/fd/n нужно задействовать функцию readlink(), рассмотренную в разделе 18.5.

<p>13. Буферизация файлового ввода-вывода</p>
Перейти на страницу:

Похожие книги