FIFO管道中的数据丢失?

时间:2015-05-06 22:39:56

标签: python c++ ipc fifo

我有一个python进程写入命名管道,而C ++程序读取它。 (我用C ++创建管道)。好吧,它似乎工作正常。但是,有时我注意到数据丢失。读者无法检测到数据!我做错了吗?

以下是我创建管道的方法:

void create_pipes(string pipename){

    char * cstr1 = new char [pipename.length()+1];
    strcpy (cstr1, pipename.c_str());

    cout << "Creating " << pipename << " pipe..." << endl;
    unlink (cstr1); // Delete pipe
    int result = mkfifo (cstr1, S_IRUSR| S_IWUSR);  // Create Pipe
    if( result == -1 ){
         cout << "There was en error creating the pipe! " << result << endl;
         //return 0;
    }
    else
        cout << "Pipe created!" << endl;
}

现在,我有一个读取管道的线程:

     int fd = open(cstr1, O_RDONLY);  // Open the pipe


    while( running_threads ){

        if(!read(fd, buf, MAX_BUF))
            continue;
        string line(buf);
        if( buf != "" ){
            //cout << line;
            pipe_r.DECODE_PIPE_DATA(line);
        }
    }

    cout << "Thread terminated" << endl;

    close(fd);

在python中,我只是通过这样做将数据写入管道:

def write_pipe(file_string):
    while True:
        try:
            pipe.write(file_string)
            pipe.flush()
            break
        except:
            print "Error while writing to pipe"
            continue

什么可能导致我的问题? python程序成功地将数据写入管道;但是c ++程序有时候不会读取管道。这可能是因为python进程在实际读取之前比c ++程序更快地编写数据吗?我该怎么办?

感谢。

1 个答案:

答案 0 :(得分:1)

buf不保证会被终止,也不保证不会从您发布的代码中嵌入'\0'个字符。这应该更好,但如果Python代码在其写入的数据中嵌入'\0',则可能仍会失败:

while( running_threads )
{
    ssize_t bytesRead = read(fd, buf, MAX_BUF);
    if ( bytesRead < 0 )
         break;
    else if ( bytesRead == 0 )
         continue;

    string line( buf, static_cast<size_t>(bytesRead) );

如果read()返回-1,您的代码无法正确处理错误情况。