Марк Митчелл - Программирование для Linux. Профессиональный подход
- Название:Программирование для Linux. Профессиональный подход
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:2002
- Город:Москва
- ISBN:5-8459-0243-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Марк Митчелл - Программирование для Linux. Профессиональный подход краткое содержание
Данная книга в основном посвящена программированию в среде GNU/Linux. Авторы применяют обучающий подход, последовательно излагая самые важные концепции и методики использования расширенных возможностей системы GNU/Linux в прикладных программах. Читатели научатся писать программы, к интерфейсу которых привыкли пользователи Linux; освоят такие технологии, как многозадачность, многопотоковое программирование, межзадачное взаимодействие и взаимодействие с аппаратными устройствами; смогут улучшить свои программы, сделав их быстрее, надежнее и безопаснее; поймут особенности системы GNU/Linux, ее ограничения, дополнительные возможности и специфические соглашения.
Книга предназначена для программистов, уже знакомых с языком С и имеющих базовый опыт работы в GNU/Linux.
Программирование для Linux. Профессиональный подход - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
length = read(fd, environment, sizeof (environment));
close(fd);
/* Функция read() не помещает в конец текста нулевой символ,
поэтому его приходится добавлять отдельно. */
environment[length] = ' \0';
/* Перебор переменных. Элементы списка отделяются друг от друга
нулевыми символами. */
next_var = environment;
while (next_var < environment + length) {
/* Вывод элементов списка. Каждый из них оканчивается нулевым
символом и потому интерпретируется как обычная строка. */
printf("%s\n", next_var);
/* Переход к следующей переменной. Поскольку каждый элемент
списка заканчивается нулевым символом, функция strlen()
вычисляет длину отдельного элемента, а не всего списка. */
next_var += strlen(next_var) + 1;
}
}
int main(int argc, char* argv[]) {
pid_t pid = (pid_t)atoi(argv[1]);
print_process_environment(pid);
return 0;
}
7.2.4. Исполняемый файл процесса
Файл exe
указывает на исполняемый файл процесса. В разделе 2.1.1, "Список аргументов", говорилось о том, что имя исполняемого файла обычно передается в качестве первого элемента списка аргументов. Но это лишь распространенное соглашение. Программу можно запустить с произвольным списком аргументов. Файл exe
файловой системы /proc
— это более надежный способ узнать, какой исполняемый файл запущен процессом.
Во многих программах путь ко вспомогательным файлам задан относительно исполняемого файла, поэтому важно знать, где именно он находится. Функция get_executable_path()
в листинге 7.5 определяет путевое имя текущего исполняемого файла, проверяя символическую ссылку /proc/self/exe
.
#include
#include
#include
#include
/* Нахождение путевого имени текущего исполняемого файла.
путевое имя помещается в строку BUFFER, длина которой
равна LEN. Возвращается число символов в имени либо
-1 в случае ошибки. */
size_t get_executable_path(char* buffer, size_t len) {
char* path_end;
/* чтение содержимого символической ссылки /proc/self/exe. */
if (readlink("/proc/self/exe", buffer, len) <= 0)
return -1;
/* Нахождение последней косой черты, отделяющей путевое имя. */
path_end = strrchr(buffer, '/');
if (path_end == NULL)
return -1;
/* Переход к символу, стоящему за последней косой чертой. */
++path_end;
/* Усечение полной строки до путевого имени. */
*path_end = '\0';
/* Длина путевого имени — это число символов до последней
косой черты. */
return (size_t)(path_end - buffer);
}
int main() {
char path[PATH_MAX];
get_executable_path(path, sizeof (path));
printf("this program is in the directory %e\n", path);
return 0;
}
7.2.5. Дескрипторы файлов процесса
Элемент fd
файловой системы /proc
— это подкаталог, в котором содержатся записи обо всех файлах, открытых процессом. Каждая запись представляет собой символическую ссылку на файл или устройство. Через эти ссылки можно осуществлять чтение и запись данных. Имена ссылок соответствуют номерам дескрипторов.
Рассмотрим небольшой трюк. Откройте новое терминальное окно и найдите с помощью команды ps
идентификатор процесса, соответствующий интерпретатору команд:
% ps
PID TTY TIME CMD
1261 pts/4 00:00:00 bash
2455 pts/4 00:00:00 ps
В данном случае процесс идентификатора команд ( bash
) имеет идентификатор 1261. Теперь откройте второе окно и просмотрите содержимое подкаталога fd
этого процесса:
% ls -l /proc/1261/fd total 0
lrwx------ 1 samuel samuel 64 Jan 30 01:02 0 -> /dev/pts/4
lrwx------ 1 samuel samuel 64 Jan 30 01:02 1 -> /dev/pts/4
lrwx------ 1 samuel samuel 64 Jan 30 01:02 2 -> /dev/pts/4
(В выводе могут присутствовать дополнительные строки, соответствующие другим открытым файлам.) Вспомните в разделе 2.1.4, "Стандартный ввод-вывод", рассказывалось о том. что дескрипторы 0, 1 и 2 закрепляются за стандартными потоками ввода, вывода и ошибок соответственно. Таким образом, при записи в файл /proc/1261/fd/1
данные будут направляться в устройство, связанное с потоком stdout
интерпретатора команд, т.е. на псевдотерминал первого окна. Попробуйте ввести следующую команду
% echo "Hello, world." >> /proc/1261/fd/1
Сообщение "Hello, world." появится в первом окне.
В подкаталоге fd
могут присутствовать ссылки и на другие файлы. В листинге 7.6 показана программа, которая открывает файл, указанный в командной строке, и переходит в бесконечный цикл.
#include
#include
#include
#include
#include
int main(int argc, char* argv[]) {
const char* const filename = argv[1];
int fd = open(filename, O_RDONLY);
printf("in process %d, file descriptor %d is open to %s\n",
(int)getpid(), (int)fd, filename);
while (1);
return 0;
}
Запустите программу в терминальном окне:
% ./open-and-spin /etc/fstab
in process 2570, file descriptor 3 is open to /etc/fstab
Теперь откройте другое окно и проверьте подкаталог fd
процесса с указанным номером:
% ls -l /proc/2570/fd
total 0
lrwx------ 1 samuel samuel 64 Jan 30 01:30 0 -> /dev/pts/2
lrwx------ 1 samuel samuel 64 Jan 30 01:30 1 -> /dev/pts/2
lrwx------ 1 samuel samuel 64 Jan 30 01:30 2 -> /dev/pts/2
lr-x------ 1 samuel samuel 64 Jan 30 01:30 3 -> /etc/fstab
Как видите, появилась, ссылка 3, которая соответствует дескриптору файла /etc/fstab
, открытого программой.
Программа может открывать дескрипторы не только файлов, но также сокетов и каналов. В таких случаях адресатом символической ссылки будет строка "socket" или "pipe", а не имя файла либо устройства.
7.2.6. Статистика использования процессом памяти
Файл statm
содержит список из семи чисел, разделенных пробелами. Каждое число — это счетчик числа страниц памяти, используемых процессом и попадающих в определенную категорию. Соответствующие категории перечислены ниже (в порядке следования счетчиков):
■ общий размер процесса;
■ размер резидентной части процесса;
■ память, совместно используемая с другими процессами (например, загруженные библиотеки или нетронутые страницы, созданные в режиме "копирование при записи");
■ текстовый размер процесса, т.е. размер сегмента кода исполняемого файла;
■ размер совместно используемых библиотек, загруженных процессом;
■ память, выделенная под стек процесса;
■ число недействительных страниц, т.е. страниц памяти, которые были модифицированы программой.
7.2.7. Статистика процесса
Файл status
содержит всевозможную информацию о процессе, отформатированную в понятном для пользователя виде. Сюда входит идентификатор процесса, идентификатор родительского процесса, реальный и эффективный идентификаторы пользователя и группы, статистика использования памяти, а также битовые маски, определяющие, какие сигналы перехватываются, игнорируются или блокируются.
Интервал:
Закладка: