命名管道竞争条件?

时间:2013-08-19 18:03:09

标签: python c named-pipes fifo mkfifo

我有两个进程,一个C和一个python。 C进程花费时间将数据传递给python进程读取的命名管道。应该非常简单,当我每秒传递数据(目前是“Mon Aug 19 18:30:59 2013”​​时间戳)时,它可以正常工作。

我睡觉时出现问题(1); C进程中的命令。当没有第二次延迟时,通信很快就被搞砸了。 python进程将读取多条消息或报告它已读取数据,即使其缓冲区为空。此时C程序通常会发生爆炸。

在我发布任何示例代码之前,我想知道是否需要在双方实现某种同步。就像告诉C进程不写入fifo一样,如果它不是空的那么?

C进程只打开命名管道写入,python进程以只读方式打开。

这两个进程都打算作为循环运行。 C进程通过USB端口不断读取数据,python进程接收每条“消息”并在将其发送到SQL Db之前对其进行解析。

如果我要查看每秒最多50封邮件,命名管道是否能够处理该级别的交易率?每个事务的大小相对较小(大约20个字节),但频率让​​我想知道我是否应该查看其他形式的进程间通信,如共享内存?

任何建议表示赞赏。如果有必要,我可以发布代码,但目前我只是想知道我是否应该以某种方式同步这两个进程。

谢谢!

1 个答案:

答案 0 :(得分:2)

管道是一条流。

发送方的write()次呼叫数量不一定与接收方read()的数量相对应。

尝试实现某种同步协议。

如果发送纯文本,你可以这样做,例如在每个令牌之间添加新行,并让接收者读取,直到找到其中一个。

或者,您可以为发送的每个数据添加前缀,并使用固定长度编号表示要传输的数据量。接收者然后可以解析这种格式。