Системный вызов 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
Файловая система /proc предоставляет прикладным программам ряд сведений о ядре. В каждом подкаталоге /proc/PID содержатся файлы и подкаталоги, предоставляющие информацию о процессе, чей идентификатор совпадает с PID. В других различных файлах и каталогах, находящихся в /proc, приводится общесистемная информация, которую программа может считать и в некоторых случаях изменить.
Системный вызов uname() позволяет нам уточнить реализацию UNIX и тип машины, на которой запущено приложение.
Дополнительные сведения о файловой системе /proc можно найти на странице руководства proc(5), в исходном файле ядра Documentation/filesystems/proc.txt и в различных файлах из каталога Documentation/sysctl.
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.
13. Буферизация файлового ввода-вывода