Попробуйте пропустить "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
...
Только для чтения, без 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 для чтения и записи в рамках одного процесса также возможно с 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.