IPC с использованием именованных каналов в C ++ и Python зависает - PullRequest
0 голосов
/ 02 сентября 2018

Я практикую IPC, используя именованные каналы в Unix, и пытаюсь записать строку в файл FIFO, используя python, и перевернуть ее через программу C ++. Но программа на Python зависает и не возвращает результата.

Код Python Для записи в файл:

import os
path= "/home/myProgram"
os.mkfifo(path)
fifo=open(path,'w')
string=input("Enter String to be reversed:\t ")
fifo.write(string)
fifo.close()

Программа зависает и не запрашивает здесь никакого ввода. Я получаю следующее сообщение об ошибке:

Traceback (most recent call last):
  File "writer.py", line 4, in <module>
    fifo=open(path,'w')
KeyboardInterrupt

C ++ код для чтения из файла:

#include <fcntl.h>
#include <iostream>
#include <sys/stat.h>
#include <unistd.h>
#include <string>
#include <string.h>

#define MAX_BUF 1024
using namespace std;

char* strrev(char *str){
    int i = strlen(str)-1,j=0;

    char ch;
    while(i>j)
    {
        ch = str[i];
        str[i]= str[j];
        str[j] = ch;
        i--;
        j++;
    }
    return str;

}


int main()
{
    int fd;
    char *myfifo = "/home/myProgram";
    char buf[MAX_BUF];

    /* open, read, and display the message from the FIFO */
    fd = open(myfifo, O_RDONLY);
    read(fd, buf, MAX_BUF);
    cout<<"Received:"<< buf<<endl;
    cout<<"The reversed string is \n"<<strrev(buf)<<endl;
    close(fd);
    return 0;
}

Поскольку программа записи не может быть выполнена, не в состоянии проверить код считывателя и, следовательно, не может упомянуть результат здесь.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 02 сентября 2018

Блоки кода Python в open(). Он ждет читателя.

Обычно можно переключиться на неблокирование и использовать os.open(). С FIFO вы получите ошибку ENXIO. Это в основном приравнивается к отсутствию читателя.

Таким образом, «владелец» FIFO должен быть читателем. Это правило может быть просто вопросом стиля. Мне неизвестны конкретные причины этого ограничения.

Вот некоторый код на python, который демонстрирует чередование нескольких читателей и писателей.

    import os
    r1 = os.open('myfifo', os.OS_RDONLY | os.OS_NONBLOCK)
    r2 = os.open('myfifo', os.OS_RDONLY | os.OS_NONBLOCK)
    w1 = os.open('myfifo', os.OS_WRONLY | os.OS_NONBLOCK)
    w2 = os.open('myfifo', os.OS_WRONLY | os.OS_NONBLOCK)
    os.write(w1, b'hello')
    msg = os.read(r1, 100)
    print(msg.decode())
    os.write(w2, b'hello')
    msg = os.read(r2, 100)
...