是否有像 WaitNamedPipe 这样的函数或在 C++/linux 上实现此功能的方法? (因此该进程不会无限期地阻塞在管道上)

发布于 2024-11-27 08:53:41 字数 561 浏览 2 评论 0 原文

我的 C++ 程序中有一个命名管道。子进程在其中写入一个值,父进程读取它。我通过 mkfifo 创建了管道,并且所有操作都是阻塞的(在尝试打开写入和 vv 之前,无法打开 fifo 进行读取) 不幸的是,有时我的子进程不会因为子进程运行的程序中的错误而停止。我的任务不是修复此外部程序中的此错误,但我想确保父进程不会在阻塞的打开 fifo 调用上无限期停止,而是在一段时间后继续运行(不读取管道中的值) )。

所以我需要的是类似 WaitNamedPipe 函数的东西。此函数将等待,直到超时间隔过去或指定的命名管道的实例可用于连接。 http://ist.marshall.edu/ist480acp/namedpipes.html#WaitNamedPipe

当然,实现这一点的另一种方法也是可行的。我在父进程中尝试了一个循环,其中它总是尝试打开管道进行读取,然后在无法打开的情况下休眠。 这似乎没有效果,可能是因为父进程在第一次打开调用时阻塞。

感谢您的任何帮助。

I have a named pipe in my C++ program. A childprocess writes a value in it and the parent process reads it. I created the pipe by mkfifo and all operations are blocking (fifo cannot be opened for reading before it is tried to open for writing and v.v.
unfortunately sometimes my childprocess does not stop because of an error in a program the childprocess runs. It is not my task to fix this error in this external program but I want to make sure that the parent process does not stop for infinite time on the blocked open fifo call, but goes on after some time (without reading the value in the pipe).

So what I need it somethings like the WaitNamedPipe function. This function waits until either a time-out interval elapses or an instance of the specified named pipe is available for connection. http://ist.marshall.edu/ist480acp/namedpipes.html#WaitNamedPipe

Another way to realize this of course also works. I tried it with a loop in the parent process in which it always tries to open the pipe for reading and then sleeps if open is not possible.
That seems to have no effect, probably because the parent process is blocking on the first open call.

Thanks for any help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

孤独难免 2024-12-04 08:53:41

您希望在 O_NONBLOCK >open(2) 标志,请参阅fifo(7)。然后使用 select(2)投票(2)等待输入(有超时)。

You want O_NONBLOCK in your open(2) flags, see fifo(7). Then use select(2) or poll(2) to wait for input (with a timeout).

岁月静好 2024-12-04 08:53:41

您可以使用非阻塞管道和带有超时的 select() 调用。或者,您可以使用之前调用过 alarm() 的阻塞 read() 调用。

You can use a non-blocking pipe and select() call with a timeout. Or you can use a blocking read() call having called alarm() before it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文