Марк Митчелл - Программирование для Linux. Профессиональный подход

Здесь есть возможность читать онлайн «Марк Митчелл - Программирование для Linux. Профессиональный подход» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2002, ISBN: 2002, Издательство: Вильямс, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Программирование для Linux. Профессиональный подход: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Программирование для Linux. Профессиональный подход»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Данная книга в основном посвящена программированию в среде GNU/Linux. Авторы применяют обучающий подход, последовательно излагая самые важные концепции и методики использования расширенных возможностей системы GNU/Linux в прикладных программах. Читатели научатся писать программы, к интерфейсу которых привыкли пользователи Linux; освоят такие технологии, как многозадачность, многопотоковое программирование, межзадачное взаимодействие и взаимодействие с аппаратными устройствами; смогут улучшить свои программы, сделав их быстрее, надежнее и безопаснее; поймут особенности системы GNU/Linux, ее ограничения, дополнительные возможности и специфические соглашения.
Книга предназначена для программистов, уже знакомых с языком С и имеющих базовый опыт работы в GNU/Linux.

Программирование для Linux. Профессиональный подход — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Программирование для Linux. Профессиональный подход», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

/* Запись начала страницы. */

write(fd, page_start, strlen(page_start));

/* Создание дочернего процесса. */

child_pid = fork();

if (child_pid == 0) {

/* Это дочерний процесс. */

/* Подготовка списка аргументов команды df. */

char* argv[] = { "/bin/df, "-h", NULL };

/* Дублирование потоков stdout и stderr для записи данных

в клиентский сокет. */

rval = dup2(fd, STDOUT_FILENO);

if (rval == -1)

system_error("dup2");

rval = dup2(fd, STDERR_FILENO);

if (rval == -1)

system_error("dup2");

/* Запуск команды df, отображающей объем свободного

пространства в смонтированных файловых системах. */

execv(argv[0], argv);

/* Функция execv() возвращает управление в программу только

при возникновении ошибки. */

system_error("execv");

} else if (child_pid > 0) {

/* Это родительский процесс, дожидаемся завершения дочернего

процесса. */

rval = waitpid(child_pid, NULL, 0);

if (rval == -1)

system_error("waitpid");

} else

/* Вызов функции fork() завершился неудачей. */

system_error("fork");

/* запись конца страницы. */

write(fd, page_end, strlen(page_end));

}

В то время как модуль issue.soпосылает содержимое файла с помощью функции sendfile(), данный модуль должен вызвать внешнюю команду и перенаправить результаты ее работы клиенту. Для этого модуль придерживается такой последовательности действий.

1. Сначала с помощью функции fork()создается дочерний процесс (см. раздел 3.2.2. "Функции fork() и exec()").

2. Дочерний процесс копирует дескриптор сокета в дескрипторы STDOUT_FILENOи STDERR_FILENO, соответствующие стандартным потокам вывода и ошибок (см. раздел 2.1.4, "Стандартный ввод-вывод"). Это копирование осуществляется с помощью системного вызова dup2()(см. раздел 5.4 3. "Перенаправление стандартных потоков ввода, вывода и ошибок"). Все последующие данные, записываемые в эти потоки в рамках дочернего процесса, будут направляться в сокет.

3. Дочерний процесс с помощью функции execv()вызывает команду df -h.

4. Родительский процесс дожидается завершения дочернего процесса, вызывая функцию waitpid()(см. раздел 5.4 2. "Системные вызовы wait()").

Этот модуль можно легко настроить на вызов другой системной команды.

11.3.4. Статистика выполняющихся процессов

Модуль processes.so(исходный текст приведен в листинге 11.9) сложнее остальных модулей. Он генерирует страницу, в которой содержится таблица процессов, выполняющихся в данный момент на сервере. Каждому процессу отводится в таблице одна строка. В этой строке указан идентификатор процесса, имя исполняемого файла, имена владельца и группы, которым принадлежит процесс, а также размер резидентной части процесса.

Листинг 11.9. ( processes.c ) Серверный модуль, отображающий таблицу процессов

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "server.h"

/* Эта функция записывает в аргументы UID и GID

идентификаторы пользователя и группы, которым

принадлежит процесс с указанным идентификатором,

в случае успешного завершения возвращается нуль,

иначе -- ненулевое значение. */

static int get_uid_gid(pid_t pid, uid_t* uid, gid_t* gid) {

char dir_name[64];

struct stat dir_info;

int rval;

/* Формирование имени каталога процесса

в файловой системе /proc. */

snprintf(dir_name, sizeof(dir_name), "/proc/%d", (int)pid);

/* Получение информации о каталоге. */

rval = stat(dir_name, &dir_info);

if (rval != 0)

/* Каталог не найден. Возможно, процесс больше

не существует. */

return 1;

/* Убеждаемся в том, что это действительно каталог. */

assert(S_ISDIR(dir_info.st_mode));

/* Определяем интересующие нас идентификаторы. */

*uid = dir_info.st_uid;

*gid = dir_info.st_gid;

return 0;

}

/* Эта функция находит имя пользователя,

соответствующее заданному идентификатору.

Возвращаемый буфер должен быть удален

в вызывающей функции. */

static char* get_user_name(uid_t uid) {

struct passwd* entry;

entry = getpwuid(uid);

if (entry == NULL)

system_error("getpwuid");

return xstrdup(entry->pw_name);

}

/* Эта функция находит имя группы, соответствующее

заданному идентификатору, возвращаемый буфер

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Программирование для Linux. Профессиональный подход»

Представляем Вашему вниманию похожие книги на «Программирование для Linux. Профессиональный подход» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Программирование для Linux. Профессиональный подход»

Обсуждение, отзывы о книге «Программирование для Linux. Профессиональный подход» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x