【问题标题】:Basic Questions about C++ & named pipes关于 C++ 和命名管道的基本问题
【发布时间】:2014-04-16 19:01:24
【问题描述】:

我正在尝试进行一些程序间数据交换,我决定尝试使用命名管道。 我有一个非常基础的读者和一个非常基础的作者,取自示例答案here

  • 我的第一个问题是我不能使用两次write(...),除非我让程序休眠。有办法解决吗? 在每个条目之后调用sleep(1) 会增加处理时间。

  • 我还希望有多个进程写入同一个 fifo。那可能吗?我的尝试返回了很多问题...

  • 最后有没有办法让fifo携带一个对象而不是一个字符串?

【问题讨论】:

  • 'C++ 命名管道'没有这样的东西吗?!?
  • 如果我在 C++ 和命名管道之间添加一个“&”会更好吗?
  • “我不能使用两次 write()”是什么意思?您应该能够重复写入 - 只是一旦管道缓冲区填满,write() 将阻塞,直到管道中有 read()s 以​​腾出一些空间...确保检查 write() 的返回值并在适当的时候检查errno

标签: c++ unix named-pipes fifo


【解决方案1】:

1) 写入 - 检查写入的结果。如果管道的另一端没有打开,则写入的字节数为0。

2) 不可能,但您可以使用一台服务器 fifo 来接收请求。然后,它为每个要连接的客户端进程生成一个管道名称,并将其发送给客户端。客户端读取服务器管道,关闭服务器管道并使用服务器提供的新名称打开管道。服务器将不得不在单独的线程中轮询所有管道。

3) 这只是一个写——它可以接受任何东西。只需将整个对象转储为二进制文件即可。请注意,对象中不应有任何指针,因为指针不会指向相同的地址空间。

【讨论】:

  • 我不明白你的第一点。你的意思是让它尝试写直到我没有得到异常?关于2和3,谢谢。你回答了我的问题
  • write 返回写入的字节数。如果管道的另一端没有打开,它将返回 0。如果您不想在重试之前等待一整秒,可以使用 unistd.h 中的 usleep。它不会抛出异常:这是 C:不是 C++。
猜你喜欢
  • 2010-12-29
  • 1970-01-01
  • 2016-03-30
  • 2014-03-31
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多