Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Флаг
O_RSYNC
read()
O_SYNC
read()
ЗАМЕЧАНИЕ. Что касается ядра версии 2.4, Linux рассматривает все три флага одинаково со значением флага
O_SYNC
4.7. Форсирование записи данных на диск
Ранее мы описали флаги
O_DSYNC
O_RSYNC
O_SYNC
open()
write()
Со слегка более высоким уровнем риска мы можем сами испечь свое пирожное и съесть его. Это осуществляется путем открытия файла без указания флагов
O_<i>x</i>SYNC
#include <unistd.h>
int fsync(int fd); /* POSIX FSC */
int fdatasync(int fd); /* POSIX SIO */
Системный вызов
fdatasync()
O_DSYNC
fsync()
O_SYNC
fsync()
Можно использовать эти вызовы с указателями файлов
<stdio.h>
fflush()
fileno()
fpsync()
/* fpsync --- синхронизация переменной stdio FILE* */
int fpsync(FILE *fp) {
if (fp == NULL || fflush(fp) == EOF || fsync(fileno(fp)) < 0)
return -1;
return 0;
}
Технически оба этих вызова являются расширениями базового стандарта POSIX:
fsync()
fdatasync()
4.8. Установка длины файла
Два системных вызова позволяют настраивать размер файла:
#include <unistd.h>
#include <sys/types.h>
int truncate(const char *path, off_t length); /* XSI */
int ftruncate(int fd, off_t length); /* POSIX */
Как должно быть очевидно из параметров,
truncate()
ftruncate()
<i>xxx()</i>
<i>fxxxx()</i>
length
Этот системный вызов происходит от 4.2 BSD Unix, и на ранних системах мог использоваться лишь для сокращения длины файла, отсюда и название. (Он был создан, чтобы облегчить реализацию операции урезания в Фортране.) На современных системах, включая Linux, имя является неправильным, поскольку с помощью этих вызовов можно также увеличить, а не только сократить длину файла. (Однако, POSIX указывает, что возможность увеличения размера файла относится к расширению XSI.)
Для этих вызовов сокращаемый файл должен иметь разрешение на запись (для
truncate()
ftruncate()
lseek()
Эти вызовы сильно отличаются от '
open(file, ... | O_TRUNC, mode)
Эти функции довольно специализированы; они используются лишь четыре раза во всем коде GNU Coreutils. Мы представляем пример использования
ftruncate()
utime()
4.9. Резюме
• Когда системный вызов завершается неудачей, он обычно возвращает -1, а в глобальной переменной errno устанавливается предопределенное значение, указывающее на проблему. Для сообщений об ошибках могут использоваться функции
perror()
strerror()
• Доступ к файлам осуществляется через небольшие целые, которые называются дескрипторами. Дескрипторы файлов для стандартного ввода, стандартного вывода и стандартной ошибки наследуются от родительского процесса программы. Другие получаются через
open()
creat()
close()
getdtablesize()
umask
umask()
creat()
O_CREAT
open()