2015-04-11 2 views
0

Я пытаюсь создать именованный канал с C++ и читать его на python. Это мой код:Pipe no такой файл или каталог

const int MAX_BUF = 1024; 
string wr_string = "Hi."; 
char text[MAX_BUF] = ""; 
strcpy(text, wr_string.c_str()); 
int fd = open("/tmp/test", O_WRONLY); // Open the pipe 
write(fd,text,MAX_BUF);    // Write 
close(fd);         // Close the pipe - allow the read 

И я читаю это так:

import os 
import time 

pipe = open("/tmp/OKC_avgprice", "r") 
line = pipe.read() 
pipe.close() 

print line 

Однако, каждый раз, когда я пытаюсь прочитать это то, что я получаю:

Traceback (most recent call last): 
    File "ipc.py", line 4, in <module> 
    pipe = open("/tmp/test", "r") 
IOError: [Errno 2] No such file or directory: '/tmp/test' 

При написании труба должна автоматически создаваться? Почему он не найден?

Спасибо!

+0

Ваша ошибка и код, который вы нам дали, отличаются. Можете ли вы проверить все так, как вы его запускали, иначе трудно решить проблему. –

+1

Это не труба, это обычный файл. –

+0

Вы создаете именованный канал или fifo с 'mkfifo (3)' в C. Также ваш C "++" код печатает мусор в трубе. –

ответ

1

Ваш код на C++ не создает именованный канал; вы должны сначала создать именованный канал с mkfifo (3):

mkfifo("/tmp/test", 0600) // 0600 means writable and readable by owner only 

Такой ФИФО будет отображаться на ls -laF (GNU), как

prw------- 1 user group  0 Apr 12 07:02 test| 

Следует отметить, что линия будет начинаться с p и там будет | после названия. Труба будет сохраняться на диске да (хотя /tmp обычно опорожняется при перезагрузках).


Обратите внимание, что если вы пытаетесь открыть файл с O_WRONLY, но файл не существует, open потерпит неудачу с ENOENT, возвращая -1 как fd. open никогда не будет пытаться создать новый файл только с O_WRONLY; чтобы создать новый файл регулярные вам нужно позвонить

open("/tmp/test", O_WRONLY|O_CREAT, 0600); 

где 0600 являются нужным режим/разрешениями для файла.

Вызов write и close с -1 впоследствии завершится с EBADF. Пожалуйста, поймите, что вы всегда должны проверить возвращаемые значения всех системных вызовов. Иногда в примерах Stackoverflow они для краткости опущены, должно быть общее знание, что нужно будет добавить проверки.


Для того, чтобы записать содержимое C++ string а, запись непосредственно из .c_str():

write(fd, wr_string.c_str(), wr_string.length()); 

Также всегда проверять коды ошибок из функций C; mkfifo, open, write могут не работать, и они возвращают значение < 0, и вам необходимо быть готовым к обработке этих случаев.

+0

Интересно. Нужно ли создавать именованный канал с mkfifo каждый раз (даже в python)? Я думал, что просто написав, он будет создан автоматически? –

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