ormorph писал(а): ↑26.11.2022 21:15
Проверил, в принципе рабочий но не совсем, права открытия немного изменил, стало работать как надо:
Код: Выделить всё
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
#define NAMEDPIPE_NAME "/tmp/my_named_pipe"
#define BUFSIZE 50
int main (int argc, char ** argv) {
FILE *fp;
char buf[BUFSIZE];
if ( mkfifo(NAMEDPIPE_NAME, 0777) ) {
perror("mkfifo");
return 1;
}
fp = fopen(NAMEDPIPE_NAME, "r+");
while (1)
{
fgets (buf, BUFSIZE, fp);
if ( ! strcmp( buf, "ambacaput\n") ) {
remove(NAMEDPIPE_NAME);
return 0;
}
printf ("%s", buf);
}
}
Если передать в файл fifo - ambacaput, то файл удаляется а программа завершается.
Спасибо, это как раз то, что нужно. По
ссылке пример такой, что он считывает строку ровно один раз и всё, это ерунда какая-то. Я пробовал разобраться в чём дело, сделал вывод, что дело в разных функциях, которые используются, у вас используется функция
fgets, а там
read. К сожалению, дальше продвинуться не мог. Почему если
read, то работать не будет в вечном цикле, чёрт его знает.
...Мой код, к сожалению, тоже не совсем хорошо работает. Например, это работать не будет:
Код: Выделить всё
#include <stdio.h>
#include <unistd.h>
int main ()
{
char bf [50];
while (1)
{
fgets (bf, 50, stdin);
printf ("%s\n", bf);
printf ("Hello, word!\n");
}
return 0;
}
Так, если данные подавать в соседней консоли так:
echo yyy > /proc/1477871/fd/0
то
"Hello, word!" выводиться не будет.
...Но самое большое удивление, это что вот эти вот
stdin,
stdout и
stderr это на самом деле одно и то же.
Shell
$ ls -l /proc/1477895/fd/*
lrwx------ 1 userd userd 64 ноя 27 08:15 /proc/1477895/fd/0 -> /dev/pts/1
lrwx------ 1 userd userd 64 ноя 27 08:15 /proc/1477895/fd/1 -> /dev/pts/1
lrwx------ 1 userd userd 64 ноя 27 08:15 /proc/1477895/fd/2 -> /dev/pts/1
$
Это выше моего понимания. Но это уже совсем другая история.
Я просто читаю маны.