Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
return 0;}Эта простая программа выводит текущий каталог, переходит в родительский каталог, затем выводит новый текущий каталог. (Переменная
cp$ <b>ch08-getcwd</b>Current dir: /home/arnold/work/prenhall/progex/code/ch08Changing to ..Current dir is now: /home/arnold/work/prenhall/progex/codeФормально, если аргумент
bufNULLgetcwd()getcwd()malloc()sizesizefree()Поведение GLIBC полезно, но не переносимо. Для кода, который должен работать на разных платформах, вы можете написать замещающую функцию, которая предоставляет те же самые возможности, в то же время заставив ее непосредственно вызывать
getcwd()Системы GNU/Linux предоставляют файл
/proc/self/cwd$ <b>cd /tmp</b> /* Сменить каталог */$ <b>ls -l /рroc/self/cwd</b> /* Посмотреть на файл */lrwxrwxrwx 1 arnold devel 0 Sep 9 17:29 /proc/self/cwd -> /tmp$ <b>cd</b> /* Перейти в домашний каталог */$ <b>ls -l /proc/self/cwd</b> /* Снова посмотреть на него */lrwxrwxrwx 1 arnold devel 0 Sep 9 17:30 /proc/self/cwd -> /home/arnoldЭто удобно на уровне оболочки, но представляет проблему на уровне программирования. В частности, размер файла равен нулю! (Это потому, что это файл в
/procПочему нулевой размер является проблемой? Если вы помните из раздела 5.4.5 «Работа с символическими ссылками»,
lstat()st_sizestruct statreadlink()readlink()readlink()xreadlink()В дополнение к
getcwd()8.4.3. Перемещение по иерархии:
nftw()Обычной задачей программирования является обработка целых иерархий каталогов: выполнение действий над каждым файлом и каждым каталогом и подкаталогом в целостном дереве. Рассмотрите, например, команду
duchown -RfindНа данный момент вы знаете достаточно, чтобы написать собственный код для открывания и чтения каталогов вручную, вызова
stat()lstat()8.4.3.1. Интерфейс
nftw()Чтобы избавиться от проблем, System V предложила функцию
ftw()ftw()Со временем стало ясно, что интерфейс
ftw()nftw()ftw()#include <ftw.h> /* XSI */int nftw(const char *dir, /* Отправная точка */ int (*fn)(const char *file, /* Указатель функции на */ const struct stat *sb, /* функцию из четырех аргументов */ int flag, struct FTW *s), int depth, int flags); /* Максимум открытых fds, флаги */А вот аргументы:
const char *dirСтрока с именем отправной точки иерархии для обработки.
int (*fn)(const char *file, const struct stat *sb, int flag, struct FTW *s)Указатель на функцию с данными аргументами. Эта функция вызывается для каждого объекта в иерархии. Подробности ниже.
int depthЭтот аргумент назван неверно. Чтобы избежать выхода за пределы дескрипторов файлов,
nftw()depthnftw()depthdepthnftw()
