Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Мы представим программу сверху вниз, начав с командной строки. В последующих разделах мы представим обработку ошибок, а затем перейдем к сущностным задачам, показав, каким образом осуществляется реальный файловый ввод/вывод.
4.2. Представление базовой структуры программы
Наша версия cat следует структуре, которая обычно является полезной. Первая часть начинается с комментариев, заголовочных файлов, объявлений и функции main():
1 /*
2 * ch04-cat.c --- Демонстрация open(), read(), write(), close(),
3 * errno и strerror().
4 */
5
6 #include <stdio.h> /* для fprintf(), stderr, BUFSIZ */
7 #include <errno.h> /* объявление errno */
8 #include <fcntl.h> /* для flags для open() */
9 #include <string.h> /* объявление strerror() */
10 #include <unistd.h> /* для ssize_t */
11 #include <sys/types.h>
12 #include <sys/stat.h> /* для mode_t */
13
14 char *myname;
15 int process(char *file);
16
17 /* main --- перечислить аргументы файла */
18
19 int
20 main(int argc, char **argv)
21 {
22 int i;
23 int errs = 0;
24
25 myname = argv[0];
26
27 if (argc == 1)
28 errs = process("-");
29 else
30 for (i = 1; i < argc; i++)
31 errs += process(argv[i]);
32
33 return (errs != 0);
34 }
…продолжение далее в главе.
Переменная
myname
main()
argv[0]
main()
process()
Когда в качестве имени файла дано
-
cat
cat
ch04-cat
argc == 1
main()
-
process()
main()
-
Если
process()
errs
main()
Структура, представленная в
main()
process()
-
Прежде чем рассмотреть функцию
process()
process()
4.3. Определение ошибок
«Если неприятность может произойти, она случается»
«Будь готов»
Ошибки могут возникнуть в любое время. Диски могут заполниться, пользователи могут ввести неверные данные, сетевой сервер, с которого осуществляется чтение, может отказать, сеть может выйти из строя и т.д. Важно всегда проверять успешность завершения каждой операции.
Основные системные вызовы Linux почти всегда возвращают при ошибке -1 и 0 или положительное значение при успехе. Это дает возможность узнать, была операция успешной или нет:
int result;
result = some_system_call(param1, param2);
if (result < 0) {
/* ошибка, что-нибудь сделать */
} else
/* все нормально, продолжить */
Знания того, что произошла ошибка, недостаточно. Нужно знать, какая произошла ошибка. Для этого у каждого процесса есть предопределенная переменная с именем
errno
errno
errno
<errno.h>
#include <errno.h> /* ISO С */
extern int errno;
Хотя сама
errno
int
errno
errno
int