Труба JNI для Android всегда ждет в FileReader [duplicate]

Чтобы использовать методы и член объекта, вам сначала нужно создать этот объект. Если вы его не создали (переменная, которая должна содержать объект, не инициализируется), но вы пытаетесь использовать его методы или переменные, вы получите эту ошибку.

Иногда вы можете просто забыть инициализировать .

Отредактировано: new не может вернуть значение null, но исключение огня при ошибке. Давно это было на некоторых языках, но не больше. Спасибо @John Saunders за указание на это.

10
задан Richard J. Ross III 14 December 2011 в 18:22
поделиться

2 ответа

Процесс блокируется до тех пор, пока не откроется другой конец трубы.

9
ответ дан NPE 25 August 2018 в 13:51
поделиться

Попробуйте пропустить "w" в качестве режима foken. "rw" не является допустимым аргументом режима для fopen, и даже если бы это было так, вы, вероятно, не хотели бы читать и писать в FIFO в том же процессе (хотя это возможно, см. ниже).

В качестве аргумента аргумент правильного режима для открытия файла для чтения и записи есть либо "r+", либо "w+" (см. ответы на этот вопрос для различий ).

Эта программа будет правильно записывать в FIFO:

#include <stdio.h>
int main(int argc, char** argv) {
    FILE* fp = fopen("/tmp/myFIFO", "w");
    fprintf(fp, "Hello, world!\n");
    fclose(fp);
    return 0;
}

Обратите внимание, что fopen в вышеуказанной программе будет блокироваться до тех пор, пока FIFO не откроется для чтения. Когда он блокируется, запустите его в другом терминале:

$ cat /tmp/myFIFO
Hello, world!
$ 

Причина, по которой он блокируется, заключается в том, что fopen не передает O_NONBLOCK в open:

$ strace -P /tmp/myFIFO ./a.out
open("/tmp/myFIFO", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
...

Некоторые сведения об открытии FIFO

Только для чтения, без O_NONBLOCK: open блокируется до тех пор, пока другой процесс не откроет FIFO для записи. Это поведение при использовании fopen с аргументом mode "r".

Только для записи, без O_NONBLOCK: open блокирует до тех пор, пока другой процесс не откроет FIFO для чтения. Это поведение при использовании fopen с аргументом mode "w".

Только для чтения, с O_NONBLOCK: open немедленно возвращается.

Только для записи, с O_NONBLOCK: open возвращает ошибку с errno, установленным в ENXIO, если другой процесс не имеет открытого FIFO для чтения.

Информация из «Расширенного программирования в среде UNIX» У. Ричарда Стивенс.

Открытие FIFO для чтения и write

Открытие FIFO для чтения и записи в рамках одного процесса также возможно с Linux. На странице Linux FIFO man указано:

В Linux, открытие FIFO для чтения и записи будет успешным как в режиме блокировки, так и в режиме неблокирования. POSIX оставляет это поведение неопределенным. Это можно использовать для открытия FIFO для записи, пока нет доступных читателей.

Вот программа, которая пишет и считывает из одного и того же FIFO:

]
#include <stdio.h>
int main(int argc, const char *argv[]) {
    char buf[100] = {0};
    FILE* fp = fopen("/tmp/myFIFO", "r+");
    fprintf(fp, "Hello, world!\n");
    fgets(buf, sizeof(buf), fp);
    printf("%s", buf);
    fclose(fp);
    return 0;
}

Он не блокируется и сразу возвращается:

$ gcc fifo.c && ./a.out 
Hello, world!

Обратите внимание, что это не переносимо и может не работать в операционных системах, кроме Linux.

15
ответ дан Tim 25 August 2018 в 13:51
поделиться
Другие вопросы по тегам:

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