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

Тут можно читать онлайн Марк Митчелл - Программирование для Linux. Профессиональный подход - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство Вильямс, год 2002. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Программирование для Linux. Профессиональный подход
  • Автор:
  • Жанр:
  • Издательство:
    Вильямс
  • Год:
    2002
  • Город:
    Москва
  • ISBN:
    5-8459-0243-6
  • Рейтинг:
    3.6/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

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

процесс с заданным идентификатором. Возвращаемый буфер

должен быть удален в вызывающей функции. */

static char* get_program_name(pid_t pid) {

char file_name[64];

char status_info[256];

int fd;

int rval;

char* open_paren;

char* close_paren;

char* result;

/* Генерируем имя файла "stat", находящегося в каталоге

данного процесса в файловой системе /proc,

и открываем этот файл. */

snprintf(file_name, sizeof(file_name), "/proc/%d/stat",

(int)pid);

fd = open(file_name, O_RDONLY);

if (fd == 1)

/* Файл не удалось открыть. Возможно, процесс

больше не существует. */

return NULL;

/* Чтение содержимого файла

rval = read(fd, status_info, sizeof(status_info) — 1);

close(fd);

if (rval <= 0)

/* По какой-то причине файл не удалось прочитать, завершаем

работу. */

return NULL;

/* Завершаем прочитанный текст нулевым символом. */

status_info[rval] = '\0';

/* Имя программы -- это второй элемент файла, заключенный в

круглые скобки. Находим местоположение скобок. */

open_paren = strchr(status_info, '(');

close_paren = strchr(status_info, ')');

if (open_paren == NULL ||

close_paren == NULL || close_paren < open_paren)

/* He удалось найти скобки, завершаем работу. */

return NULL;

/* Выделение памяти для результирующей строки */

result = (char*)xmalloc(close_paren — open_paren);

/* Копирование имени программы в буфер. */

strncpy(result, open_paren + 1, close_paren - open_paren — 1);

/* Функция strncpy() не завершает строку нулевым символом,

приходится это делать самостоятельно. */

result[close_paren - open_paren - 1] = '\0';

/* Конец работы. */

return result;

}

/* Эта функция определяет размер (в килобайтах) резидентной

части процесса с заданным идентификатором.

В случае ошибки возвращается -1. */

static int get_rss(pid_t pid) {

char file_name[64];

int fd;

char mem_info[128];

int rval;

int rss;

/* Генерируем имя файла "statm", находящегося в каталоге

данного процесса в файловой системе proc. */

snprintf(file_name, sizeof(file_name), "/proc/%d/statm",

(int)pid);

/* Открытие файла. */

fd = open(file_name, O_RDONLY);

if (fd == -1)

/* Файл не удалось открыть. Возможно, процесс больше не

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

return -1;

/* Чтение содержимого файла. */

rval = read(fd, mem_info, sizeof(mem_info) — 1);

close(fd);

if (rval <= 0)

/* Файл не удалось прочитать, завершаем работу. */

return -1;

/* Завершаем прочитанный текст нулевым символом. */

mem_infо[rval] = '\0';

/* Определяем размер резидентной части процесса. Это второй

элемент файла. */

rval = sscanf(mem_info, "%*d %d", &rss);

if (rval != 1)

/* Содержимое файла statm отформатировано непонятным

образом. */

return -1;

/* Значения в файле statm приведены в единицах, кратных размеру

системной страницы. Преобразуем в килобайты. */

return rss * getpagesize() / 1024;

}

/* Эта функция генерирует строку таблицы для процесса

с заданным идентификатором. Возвращаемый буфер должен

удаляться в вызывающей функции, в случае ошибки

возвращается NULL. */

static char* format_process_info(pid_t pid) {

int rval;

uid_t uid;

gid_t gid;

char* user_name;

char* group_name;

int rss;

char* program_name;

size_t result_length;

char* result;

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

принадлежит процесс. */

rval = get_uid_gid(pid, &uid, &gid);

if (rval != 0)

return NULL;

/* Определяем размер резидентной части процесса. */

rss = get_rss(pid);

if (rss == -1)

return NULL;

/* Определяем имя исполняемого файла процесса. */

program_name = get_program_name(pid);

if (program_name == NULL)

return NULL;

/* Преобразуем идентификаторы пользователя и группы в имена. */

user_name = get_user_name(uid);

group_name = get_group_name(gid);

/* Вычисляем длину строки, в которую будет помещен результат,

и выделяем для нее буфер. */

result_length =

strlen(program_name) + strlen(user_name) +

strlen(group_name) + 128;

result = (char*)xmalloc(result_length);

/* Форматирование результата. */

snprintf(result, result_length,

"

%d %s %s %s %d \n",

(int)pid, program_name, user_name, group_name, rss);

/* Очистка памяти. */

free(program_name);

free(user_name);

free(group_name);

/* Конец работы. */

return result;

}

/* HTML-код начала страницы, содержащей таблицу процессов. */

static char* page_start =

"\n"

"

\n"

"

\n"

"

\n"

"

\n"

"

\n"

"

\n"

"

\n"

"

\n"

"

\n"

"

\n"

"

\n"

"

\n";

/* HTML-код конца страницы, содержащей таблицу процессов. */

static char* page_end =

"

\n"

"

PID Program User Group RSS (KB)
\n"

"

\n"

"

\n";

void module_generate(int fd) {

size_t i;

DIR* proc_listing;

/* Создание массива iovec. В этот массив помещается выходная

информации, причем массив может увеличиваться динамически. */

/* Число используемых элементов массива */

size_t vec_length = 0;

/* выделенный размер массива */

size_t vec_size = 16;

/* Массив элементов iovec. */

struct iovec* vec =

(struct iovec*)xmalloc(vec_size *

sizeof(struct iovec));

/* Сначала в массив записывается HTML-код начала страницы. */

vec[vec_length].iov_base = page_start;

vec[vec_length].iov_len = strlen(page_start);

++vec_length;

/* Получаем список каталогов в файловой системе /proc. */

proc_listing = opendir("/proc");

if (proc_listing == NULL)

system_error("opendir");

/* Просматриваем список каталогов. */

while (1) {

struct dirent* proc_entry;

const char* name;

pid_t pid;

char* process_info;

/* Переходим к очередному элементу списка. */

proc_entry = readdir(proc_listing);

if (proc_entry == NULL)

/* Достигнут конец списка. */

break;

/* Если имя каталога не состоит из одних цифр, то это не

каталог процесса; пропускаем его. */

name = proc_entry->d_name;

if (strspn(name, "0123456789") != strlen(name))

continue;

/* Именем каталога является идентификатор процесса. */

pid = (pid_t)atoi(name);

/* генерируем HTML-код для строки таблицы, содержащей

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

process_info = format_process_info(pid);

if (process_info == NULL)

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

Интервал:

Закладка:

Сделать


Марк Митчелл читать все книги автора по порядку

Марк Митчелл - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Программирование для Linux. Профессиональный подход, автор: Марк Митчелл. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x