У меня есть проблема, связанная с функциями fifos и write()
и read()
. Я создаю fifo через функцию mkfifo()
, тогда я использую fork()
для генерации двух процессов: первый открывается и записывает на fifo через write(); другой открывается и читается через read(). Моя проблема в том, что write()
пишет на stdout, и read()
ждет меня, чтобы написать что-то на stdin и нажать Enter, точно так же, как scanf()
, таким образом, не используя fifo. Я действительно не знаю, что делать дальше, я пробовал все и пока не нашел проблем в Интернете. Я использую gcc-компилятор и Xubuntu 15.10.write() и read() не работают на stdio вместо fifo
генератор процесса
int main (void) {
int f = mkfifo("try", S_IRUSR | S_IWUSR);
if (f < 0)
printf("mkfifo went fine\n");
else
printf("mkfifo went wrong\n");
pid_t fo = fork();
switch (fo) {
case -1:
printf("err\n");
case 0:
execlp("prova_fifo2", "prova_fifo2", NULL);
default:
execlp("prova_fifo", "prova_fifo", NULL);
}
return (0);
}
Writer (ака prova_fifo)
int main (void) {
int fd;
if (fd = open("try", O_WRONLY) == -1)
printf("Error opening FIFO\n");
char buf[6];
sprintf(buf, "hello");
int writer = write(fd, buf, strlen(buf));
printf("%d", writer);
return (0);
}
Reader (ака prova_fifo2)
int main (void) {
int fd;
if (fd = open("try", O_RDONLY) ==-1)
printf("Errore in apertura FIFO\n");
char buf[6];
read(fd,&buf, strlen(buf)); //tried removing the "&", didn't work
printf("READ: %s", buf);
return (0);
}
ПРИМЕЧАНИЕ Я включаю в себя все необходимые библиотеки, код компилируется и запускается. Моя единственная проблема - это упомянутая выше.
'чтения (FD, и ЬиЕ , strlen (buf)), этот атрибут uninntialised, aand strlen() может делать ужасные вещи, если он не находит 0. также: read() * может * читать больше, чем фактический размер, в маленький буфер – wildplasser
относительно блок кода, начинающийся с 'if (f <0)' 1), если 'f' меньше 0, тогда вызов mkfifo() завершился неудачно. В этом случае вызовите: 'perror (mkfifo failed); exit (EXIT_FAILURE);'. Потому что, если функция не работает, в коде нет причины продолжать, а вызов 'perror()' будет выводить то, что система думает, что проблема была – user3629249
, когда вызов 'execlp()' failed, вызов вернется.поэтому каждый вызов 'execlp()' должен сопровождаться чем-то вроде: 'perror (" execlp failed "); exit (EXIT_FAILURE); ' – user3629249