Марк Митчелл - Программирование для Linux. Профессиональный подход
- Название:Программирование для Linux. Профессиональный подход
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:2002
- Город:Москва
- ISBN:5-8459-0243-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Марк Митчелл - Программирование для Linux. Профессиональный подход краткое содержание
Данная книга в основном посвящена программированию в среде GNU/Linux. Авторы применяют обучающий подход, последовательно излагая самые важные концепции и методики использования расширенных возможностей системы GNU/Linux в прикладных программах. Читатели научатся писать программы, к интерфейсу которых привыкли пользователи Linux; освоят такие технологии, как многозадачность, многопотоковое программирование, межзадачное взаимодействие и взаимодействие с аппаратными устройствами; смогут улучшить свои программы, сделав их быстрее, надежнее и безопаснее; поймут особенности системы GNU/Linux, ее ограничения, дополнительные возможности и специфические соглашения.
Книга предназначена для программистов, уже знакомых с языком С и имеющих базовый опыт работы в GNU/Linux.
Программирование для Linux. Профессиональный подход - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
if (S_ISLNK(st.st_mode))
return "symbolic link";
else if (S_ISDIR(st.st_mode))
return "directory";
else if (S_ISCHR(st.st_mode))
return "character device";
else if (S_ISBLK(st.st_mode))
return "block device";
else if (S_ISFIFO(st.st_mode))
return "fifo";
else if (S_ISSOCK(st.st_mode))
return "socket";
else if (S_ISREG(st.st_mode))
return "regular file";
else
/* Нераспознанный тип. */
assert(0);
}
int main(int argc, char* argv[]) {
char* dir_path;
DIR* dir;
struct dirent* entry;
char entry_path[PATH_MAX + 1];
size_t path_len;
if (argc >= 2)
/* Если каталог указан в командной строке, анализируем его. */
dir_path = argv[1];
else
/* В противном случае анализируем текущий каталог. */
dir_path = ".";
/* Копируем имя каталога в переменную entry_path. */
strncpy(entry_path, dir_path, sizeof(entry_path));
path_len = strlen(dir_path);
/* Если имя каталога не заканчивается косой чертой,
добавляем ее. */
if (entry_path[path_len - 1] != '/') {
entry_path[path_len] = '/';
entry_path[path_len + 1] = '\0';
++path_len;
}
/* Начинаем обрабатывать список содержимого каталога. */
dir = opendir(dir_path);
/* просматриваем все элементы каталога. */
while ((entry = readdir(dir)) != NULL) {
const char* type;
/* Формируем полное путевое имя элемента каталога. */
strncpy(entry_path + path_len, entry->d_name,
sizeof(entry_path) — path_len);
/* Определяем тип элемента. */
type = get_file_type(entry_path);
/* Отображаем собранную информацию. */
printf("%-18s: %s\n", type, entry_path);
}
/* Конец работы. */
closedir(dir);
return 0;
}
Приведем несколько строк листинга полученного в каталоге /dev
(в разных системах могут быть выданы разные результаты)
% ./listdir /dev
directory : /dev/.
directory : /dev/..
socket : /dev/log
character device : /dev/null
regular file : /dev/MAKEDEV
fifo : /dev/initctl
character device : /dev/agpgart
...
Для проверки этих данных можно воспользоваться командой ls
. Флаг -U
отменяет сортировку списка, а флаг -a
заставляет включить в список записи текущего ( .
) и родительского ( ..
) каталогов.
% ls -lua /dev total 124
drwxr-xr-x 7 root root 36864 Feb 1 15:14 .
drwxr-xr-x 22 root root 4096 Oct 11 16:39 ..
srw-rw-rw- 1 root root 0 Dec 18 01:31 log
crw-rw-rw- 1 root root 1, 3 May 5 1998 null
-rwxr-xr-x 1 root root 26689 Mar 2 2000 MAKEDEV
prw------- 1 root root 0 Dec 11 18:37 initctl
crw-rw-r-- 1 root root 10, 175 Feb 3 2000 agpgart
Первый символ каждой строки определяет тип элемента каталога.
Приложение В
Таблица сигналов
В табл. В.1 перечислены сигналы, которые чаще всего приходится обрабатывать в Linux-программах. Некоторые сигналы имеют разные интерпретации в зависимости от того, где они были получены.
Указанные имена сигналов определены в виде макроконстант препроцессора. Чтобы иметь возможность сослаться на них в программе необходимо подключить файл . Реальное определение сигналов дано в файле /usr/sys/signum.h
, который подключается к файлу .
Для получения полного списка сигналов, поддерживаемых в Linux, необходимо выполнить такую команду:
% man 7 signal
Таблица В.1. Сигналы ОС Linux
Название | Описание |
---|---|
SIGHUP |
Linux посылает этот сигнал, когда происходит отключение от терминала. Многие программы применяют этот сигнал в совершенно иных целях: он служит указанием программе повторно прочитать свой файл конфигурации |
SIGINT |
Linux посылает процессу этот сигнал, когда пользователь пытается завершить процесс нажатием клавиш |
SIGILL |
Процесс получает этот сигнал при попытке выполнить недопустимую инструкцию. Это может означать повреждение стека программы |
SIGABRT |
Этот сигнал посылается функцией abort() |
SIGFPE |
По течение этого сигнала означает, что процесс выполнил недопустимую операцию с плавающей запятой. В зависимости от конфигурации центрального процессора результатом операции может стать специальное нечисловое значение, например inf (бесконечность) или NaN (не число), а не сигнал SIGFPE |
SIGKILL |
Этот сигнал приводит к немедленному завершению процесса и не может быть перехвачен |
SIGUSR1 |
Этот сигнал зарезервирован для прикладного использования |
SIGUSR2 |
Этот сигнал зарезервирован для прикладного использования |
SIGSEGV |
Этот сигнал означает, что программа выполнила недопустимое обращение к памяти. Возможно, указанный адрес находится за пределами адресного пространства процесса или процессу запрещен доступ к этому участку памяти |
SIGPIPE |
Этот сигнал означает, что программа обратилась к разрушенному потоку данных, например к сокету, который был закрыт на противоположной стороне |
SIGALRM |
Доставка этого сигнала планируется функциями alarm() и setitimer() (см. раздел 8.13 "Функция setitimer(): задание интервальных таймеров") |
SIGTERM |
Этот сигнал является запросом на завершение процесса и посылается командой kill по умолчанию |
SIGCHLD |
Linux посылает процессу этот сигнал при завершении одного из дочерних процессов (см. раздел 3.4.4, "Асинхронное удаление дочерних процессов") |
SIGXCPU |
Linux посылает процессу этот сигнал в случае превышения разрешенного времени доступа к центральному процессору (см. раздел 8.5, "Функции getrlimit() и setrlimit(): лимиты ресурсов") |
SIGVTALRM |
Доставка этого сигнала планируется функцией setitimer() (см. раздел 8.13, "Функция setitimer() : задание интервальных таймеров") |
Приложение Г
Internet-ресурсы
В этом приложении перечислен ряд Web-узлов, где можно найти информацию о программировании Linux-систем.
Г.1. Общая информация
■ http://www.advancedlinuxprogramming.com
. Это Web-узел данной книги. Здесь можно загрузить текст книги в электронном виде вместе с исходными текстами программ, найти ссылки на другие ресурсы и получить дополнительную информацию о программировании в Linux.
■ http://www.linuxdoc.org
. Это Web-узел проекта Linux Documentation Project. Здесь находится хранилище всевозможной документации, а также FAQ-архивов.
Г.2. Информация о программном обеспечении GNU/Linux
■ http://www.gnu.org
. Это Web-узел проекта GNU Project. Здесь можно загрузить всевозможные бесплатно распространяемые программы. Среди них и GNU-библиотека языка С, содержащая многие из описанных в данной книге функций. Здесь же приведена информация о том. как внести свой вклад в развитие системы GNU/Linux, написав программный код и документацию либо использовав бесплатное программное обеспечение.
Интервал:
Закладка: