问题标签 [named-pipes]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - 在命名管道(FIFO)上使用 poll() 时,看起来 OS X 确实存在错误......专家可以确认吗?
我一直在尝试从一组命名管道中进行轮询一段时间,并且我不断收到 POLLNVAL 对任何命名管道文件描述符的即时响应。在找到这篇关于 OS X 中的错误轮询的博客文章后,我很确定这是 OS X 中的一个错误。
我已经计划将我的代码切换为使用 UDP 套接字,但我想要求 SO 对此进行验证 a) 以便我确定它真的坏了,并且 b) 用于文档目的。
这是我编写的代码的精简版本(尽管上面链接中的代码经过我测试,拼写得很好):
这输出:
令人作呕。
还有其他人遇到这个吗?这是一个真正的错误,对吧?
c++ - 打破 ReadFile() 阻塞 - 命名管道 (Windows API)
为简化起见,这是 NamedPipe SERVER 正在等待 NamedPipe CLIENT 写入管道的情况(使用 WriteFile())
阻塞的 Windows API 是 ReadFile()
服务器已创建启用阻塞的同步管道(无重叠 I/O)
客户端已连接,现在服务器正在等待一些数据。
在正常的事情流程中,客户端发送一些数据,服务器处理它,然后返回到 ReadFile() 以等待下一个数据块。
同时发生了一个事件(例如用户输入),NamedPipe SERVER 现在必须执行一些其他代码,而在 ReadFile() 阻塞时它不能执行这些代码。
此时我需要提一下,NamedPipe Client 不是我的应用程序,所以我无法控制它。我不能让它发送几个字节来解除对服务器的阻塞。它只是坐在那里不发送任何数据。由于我无法控制客户端实现,因此我无法对此进行任何更改。
一种解决方案是创建一个单独的线程,在其中执行所有 ReadFile() 操作。这样当事件发生时,我就可以处理代码。问题在于该事件还需要一个单独的线程,所以现在我为该服务器的每个实例添加了两个额外的线程。由于这需要可扩展,因此这是不可取的。
从另一个线程我尝试过调用
和
它们都不会返回(直到客户端写入管道。)
我无法连接到同一个管道并写入几个字节,因为:
“命名管道的所有实例共享相同的管道名称,但每个实例都有自己的缓冲区和句柄,并为客户端/服务器通信提供单独的管道。”
http://msdn.microsoft.com/en-us/library/aa365590.aspx
我需要一种方法来伪造它,所以 64,000 美元的问题是:
如何打破 ReadFile() 的阻塞?
c - 将数据提供给需要文件名的 C API
我正在 Linux 上编写一个简单的 C 程序,并希望使用现有库的 API,该 API 需要来自文件的数据。我必须将文件名作为 const char* 提供给它。但是我有数据,就像文件的内容一样,已经位于堆上分配的缓冲区中。有大量的 RAM,我们想要高性能。想要避免将临时文件写入磁盘,以看起来像文件的方式将数据提供给此 API 的好方法是什么?
这是我的代码的廉价假装版本:
奇妙图书馆.h:
normal-persons-usage.cpp,最初为其设计的库:
我的程序.cpp:
需要明确的是,marvelouslibrary 不提供任何通过指针接受数据的 API 函数。它只能读取一个文件。
我想到了管道和 mkfifo(),但似乎是为了在进程之间进行通信。我不是这些事情的专家。命名管道是否可以在同一进程中读取和写入?这是明智的做法吗?
或者跳过聪明,使用计划“B”,即shddup并只写一个临时文件。但是,除了获得高性能之外,我想学习一些新东西并找出在这种情况下可能发生的事情。
c# - 关闭 NamedPipeServer#WaitForConnection 上阻塞的线程的好方法是什么?
我启动了我的应用程序,它产生了许多线程,每个线程都创建一个 NamedPipeServer(.net 3.5 为命名管道 IPC 添加了托管类型)并等待客户端连接(块)。代码按预期运行。
现在我还需要一个 Shutdown 方法来彻底关闭这个过程。我尝试了通常的布尔标志 isShutdownRequested 技巧。但是管道流在 WaitForConnection() 调用上保持阻塞,并且线程不会死亡。
加入永不返回。
我没有尝试但可能可行的一个选项是调用 Thread.Abort 并吃掉异常。但这感觉不对..任何建议
更新 2009-12-22
很抱歉没有早点发布。这是我收到的来自 Kim Hamilton(BCL 团队)的回复
进行可中断的 WaitForConnection 的“正确”方式是调用 BeginWaitForConnection,在回调中处理新连接,然后关闭管道流以停止等待连接。如果管道关闭,EndWaitForConnection 将抛出 ObjectDisposedException 回调线程可以捕获,清理任何松散的末端,并干净地退出。
我们意识到这一定是一个常见问题,所以我团队中的某个人计划很快在博客上讨论这个问题。
java - 如何从 Java 打开 Windows 命名管道?
在我们的 Linux 系统上,我们使用命名管道进行进程间通信(生产者和消费者)。
为了测试消费者(Java)代码,我想(在Java中)实现一个虚拟生产者,它写入连接到消费者的命名管道。
现在测试也应该在 Windows 开发环境中工作。因此,我想知道如何在 Windows 中从 Java 创建命名管道。在 Linux 中我可以使用 mkfifo(称为 using Runtime.exec()
),但在 Windows 上我应该如何做到这一点?
winapi - 如何在管道上使用 WriteFile 修复乱码文本?
我正在制作一个 Win32 应用程序,它通过命名管道将字符串从一个进程发送到另一个进程。但是,在管道上调用 ReadFile 的进程会获取其中包含一些乱码数据的字符串。它返回正确写入的字节数,但字符串的最后 8 个字符左右是乱码。
这是创建管道并写入管道的代码:
这是读取它的代码:
当显示 MessageBox 时,字符串的结尾是乱码,我不知道为什么。有任何想法吗?
谢谢!
unix - 您如何解决命名管道的问题?
我有一个二进制程序*,它获取所提供文件的内容,对其进行处理,并通过标准输出在屏幕上打印结果。对于自动化脚本,我想使用命名管道将数据发送到该程序并自己处理输出。在尝试让脚本工作后,我意识到二进制程序从命名管道接受数据存在问题。为了说明这个问题,我概述了几个使用 unix shell 的测试。
很容易证明程序通过处理实际数据文件来工作。
这将导致 output.txt 包含来自 file.txt 的已处理信息。
如本演示所示,命名管道 (pipe.txt) 的工作原理。
这将导致 output.txt 在通过管道发送后包含来自 file.txt 的数据。
当二进制程序从命名管道而不是文件读取时,事情不能正常工作。
在这种情况下,即使 cat 和 binprog 终止, output.txt 也不包含任何数据。使用 top 和 ps,我可以看到 binprog “运行”并且似乎在工作。一切都执行没有错误。
为什么在第三个示例中 binprog 没有输出?
我可以尝试哪些事情来使它正常工作?
[*] 有问题的程序是来自libsvm的 svm-scale 。我选择概括示例以保持它们的简洁。
c++ - IIS 下的 Windows 命名管道 ACL
我正在尝试使用命名管道将 CGI 进程连接到我的 Windows 服务。我的代码在我的开发机器上使用另一台服务器运行良好,但在 IIS 上,当我在 CGI 进程中调用 CreateFile() 时会出现安全问题。
Windows 服务是命名管道服务器,因此 CGI 进程试图作为客户端连接到该命名管道。
我已经挖掘了一些代码,这些代码通过调用以下方法创建了一个带有 SECURITY_WORLD_SID_AUTHORITY 标志的全局安全描述符:
但我真的不明白这个概念。我假设管道服务器 CreateNamedPipe() 必须在 SECURITY_ATTRIBUTES 结构中使用此 ACL 调用,但是命名管道客户端呢?
我是否要创建另一个全局安全描述符并使用它调用 CreateFile()?
我继承它吗
我只是在 CreateFile() 调用中传递 Null 吗?
c# - 在 mono/Linux 下从命名管道读/写
我想从 Linux 下的命名管道/FIFO 队列中读取/写入。我已经尝试过 System.IO 中的标准类 StreamWriter 和其他类,但它失败了,因为它使用了 seek。有没有人使用 Mono 从命名管道写入/读取?我正在设法阅读和写作-但不是同时...
c++ - Win32 命名管道和远程客户端
给定计算机 A 的 IP 地址,我可以从计算机 B 访问计算机 A 上的命名管道吗?如果是这样,我需要做些什么来实现这一点?