Системное программирование в Linux от Роберта Лава

Android

Member
Регистрация
05.07.2019
Сообщения
84
Оценка реакций
25
0C52435A-B2E0-4146-967A-EEFF836E2170.png

Введение:

процессы наследуют UID и GID

восьмезначные разрешения: r = 4, w = 2, x = 1. Заказ это пользователь, группа, все остальные

функции обычно просто возвращают -1, чтобы указать на ошибку

более подробную информацию можно найти в extern int errno в <errno.h>

напечатать void perror (const char * str) в <stdio.h>

пример:

if (close (fd) == −1)

perror («закрыть»);



Файловый ввод / вывод

Открытие файлов:

fd = open (<путь>, флаги)

Создайте:

fd = открыть (файл, O_WRONLY | O_CREAT | O_TRUNC, 0664);

идентично

fd = creat (имя файла, 0644);

fd of -1 указывает на ошибку

чтение:

#include <unistd.h>

ssize_t read (int fd, void * buf, size_t len);

Вызов read () может привести ко многим возможностям, чтобы прочитать все байты

ssize_t ret;

while (len! = 0 && (ret = read (fd, buf, len))! = 0) {

if (ret == −1) {

if (errno == EINTR)

Продолжить;

perror («читать»);

перерыв;

}

len - = ret;

buf + = ret;

}

неблокирующие чтения могут быть достигнуты, передав O_NONBLOCK, чтобы открыть

если чтение заблокировано, оно вернет -1 и errno будет установлено в EAGAIN

записывать:

#include <unistd.h>

запись ssize_t (int fd, const void * buf, size_t count);

вызов fsync (int ft) для синхронизации записей в хранилище

fdatasync (int fd) делает то же самое без обновленных метаданных и работает быстрее

используйте флаг O_SYNC, чтобы всегда синхронизировать

закрытие:

#include <unistd.h>

int close (int fd) `

Ищу:

#include <sys / types.h>

#include <unistd.h>

off_t lseek (int fd, off_t pos, int origin);

Вы МОЖЕТЕ искать за концом файла, он будет заполнен нулями

позиция читает и пишет, чтобы избежать расы, связанной с поиском, а затем чтением

#define _XOPEN_SOURCE 500

#include <unistd.h>

ssize_t pread (int fd, void * buf, size_t count, off_t pos);

ssize_t pwrite (int fd, const void * buf, size_t count, off_t pos);

Мультиплексный ввод-вывод



poll () проще в использовании, чем select ()

оба ждут набора дескрипторов открытых файлов и возвращаются, когда они доступны

пример опроса

#include <stdio.h>

#include <poll.h>

#include <unistd.h>



int main (int argc, char ** argv)

{

struct pollfd fds [2];

fds [0] .fd = STDIN_FILENO;

fds [0] .events = POLLIN;



fds [1] .fd = STDOUT_FILENO;

fds [1] .events = POLLOUT;



int err = poll (fds, (nfds_t) 2, 0);

if (err == -1) {

PError ( "опрос");

возврат -1;

}



if (fds [0] .revents & POLLIN) {

printf ("STDIN готов \ n");

}

if (fds [1] .revents & POLLOUT) {

printf ("STDOUT ready \ n");

}



вернуть 0;

}

VFS предоставляет унифицированный интерфейс на основе блоков и inode для всех файловых систем.

Кэш страницы содержит извлеченную информацию, включая заголовки.
 
Автор Название темы Категория Ответов Дата темы
A Другие ЯП 0
HARD_RESET Другие ЯП 0

Название темы