2016-12-14 9 views
-3

Я пытаюсь сделать именованный канал на c под linux с помощью команды mkfifo. Но когда я запускаю программу, я либо получаю «нет такого файла или каталога» ошибку или абсолютно ничего (консоль ничего не отображается)Программа работает mkfifo не работает

Вот мой код:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <errno.h> 

#define MAX_LINE 80 

int main(int argc, char** argv) { 
int create; 
//mkfifo("/tmp/myfifo", 0666); 
create = mkfifo("tmp/myfifo", 0666); 
if (create==-1) 
{ 
    printf("error%s", strerror(errno)); 
} 
char line[MAX_LINE]; 
int pipe; 
pipe = open("/tmp/myfifo", O_WRONLY); 
if (pipe==-1) 
{printf("error"); 
} 
printf("Enter line: "); 
fgets(line, MAX_LINE, stdin); 
write(pipe, line, strlen(line)); 
sleep (100); 
close(pipe); 
return 0; 
} 

Я все еще учусь , и я не понимаю, что я делаю неправильно. Спасибо за вашу помощь.

+0

См. [Ask], следуйте советам, отформатируйте и отформатируйте этот беспорядок правильно. – Olaf

ответ

1

Для того, чтобы именованный канал был полезным, кто-то должен его прочитать, и кто-то должен его написать. Обычно это будут две отдельные программы. Ваша программа - писатель. Где читатель?

Если нет читателя, нормально, чтобы программа блокировалась на O_WRONLY открыт. Поэтому, когда ваша программа ничего не делает, это просто делает это:

pipe = open("/tmp/myfifo", O_WRONLY); 

, который ждет, пока читатель появится.

В другом терминале запустите cat /tmp/myfifo. Наличие читателя позволит писателю добиться прогресса. Ваша программа проснется и перейдет к приглашению Enter line, и то, что вы вводите, будет считано cat и записано на второй терминал.

Другая проблема - несогласованность в ваших файлах. В одном месте вы написали "tmp/myfifo" без ведущей косой черты, поэтому вы пытаетесь создать именованный канал в каталоге tmp, который находится внутри текущего рабочего каталога. Если этого каталога tmp не существует, то результатом будет No such file or directory.

+0

У меня есть вторая программа-читатель, которая запускает ее из другого временного окна: ./test2 ttime__vdso_get _? @? @@ –

+0

У меня плохое использование неправильного типа printf(). Большое спасибо. –

Смежные вопросы