FIFO管道中的数据丢失?

2024-09-30 01:29:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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;
}

现在,我有一个线程可以读取管道,如下所示:

^{pr2}$

在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++程序更快地写入数据?我该怎么办?在

谢谢。在


Tags: 数据程序string管道进程resultfilewrite
1条回答
网友
1楼 · 发布于 2024-09-30 01:29:50

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。在

相关问题 更多 >

    热门问题