Как можно сбросить запись с помощью дескриптора файла?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

35
задан Iharob Al Asimi 24 December 2014 в 16:37
поделиться

5 ответов

У Вас есть два варианта:

  1. Использование fileno() для получения дескриптора файла, связанного с stdio, потоковый указатель

  2. не использует <stdio.h> вообще, тот способ, которым Вы не должны волновать по поводу сброса ни одного - все записи сразу перейдут к устройству, и для устройств посимвольного ввода-вывода эти write(), вызов даже не возвратится, пока IO низшего уровня не завершился (в теории).

Для уровня устройств IO я сказал бы, что довольно необычно использовать stdio. Я настоятельно рекомендовал бы использовать низшего уровня open(), read() и write() функции вместо этого (на основе Вашего более позднего ответа):

int fd = open("/dev/i2c", O_RDWR);
ioctl(fd, IOCTL_COMMAND, args);
write(fd, buf, length);
26
ответ дан 27 November 2019 в 06:55
поделиться

fflush() только сбросы буферизация, добавленная слоем stdio fopen(), как управляется эти FILE * объект. Сам базовый файл, как замечено ядром, не буферизуется на этом уровне. Это означает, что пишет, что обходят FILE *, слой, с помощью fileno() и сырые данные write(), также не буферизуется способом, что fflush() сбросил бы.

, Поскольку другие указали, попробуйте не смешивание двух. Если необходимо использовать "необработанные" функции ввода-вывода такой в качестве ioctl(), то open() файл сами непосредственно, без [1 113] использование fopen<() и друзья от stdio.

9
ответ дан 27 November 2019 в 06:55
поделиться

Если Вы хотите пойти наоборот (свяжите ФАЙЛ* с существующим дескриптором файла), используйте fdopen ():

                                                          FDOPEN(P)

NAME

       fdopen - associate a stream with a file descriptor

SYNOPSIS

       #include <stdio.h>

       FILE *fdopen(int fildes, const char *mode);
1
ответ дан 27 November 2019 в 06:55
поделиться

Похоже, что вы ищете функцию fsync () (или fdatasync ()?), Или вы можете использовать флаг O_SYNC в вызове open ().

2
ответ дан 27 November 2019 в 06:55
поделиться

Я думаю, что вы ищете, может быть

int fsync(int fd);

или

int fdatasync(int fd);

fsync сбросит файл из буфера ядра на диск. fdatasync также подойдет, за исключением метаданных.

33
ответ дан 27 November 2019 в 06:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: