Используйте WinDbg для записи содержимого управляемого байта [] в файл

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

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

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

#include 
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 для записи, пока нет доступных читателей.

blockquote>

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

]
#include 
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.

16
задан Liran 24 November 2010 в 21:09
поделиться