windows - 套接字对、perl、KEEPALIVE 和轮询

标签 windows perl sockets automation

我已经开始在 linux 和 windows 上使用 socketpairs 来捕获两个平台上子进程的输出。我通过将 STD* 复制到 socketpair 中的一个套接字上来做到这一点(我在 perl 中使用 Win32::SocketPair for socketpair's on windows)。我这样做的主要原因是读取不会阻塞输出文件句柄。

我遇到的问题是 kill(0,...) 在 Windows 上不起作用,所以我需要另一种方法来检测进程是否关闭。我查看了 SO_KEEPALIVE,但这似乎不适用于 socketpairs .../p>

然后我开始研究套接字上的事件轮询。 POLLHUP 事件看起来很有希望,但我不确定它们像这样使用时是否有效。

我正在寻求自动化交互式程序(不,我不能使用 Except,因为它在 Windows 平台上不起作用......除非你找到一个可以的?)。我一直在 Windows 上使用“cat”进行测试(我安装了 cat.exe)。到目前为止它看起来不错,但有 2 个问题:

  • 无法检测进程是否刚刚结束(kill(0,...) 不起作用)
  • 无法从子进程中检测到 EOF(sysread 似乎总是返回 undef 或读取的字节数,从不为 0,即使在我关闭($sock,1)之后也是如此)

我可能正在做一些非常愚蠢的事情,但我们将不胜感激任何建议/帮助。

更新:我开始使用 waitpid($pid, WNOHANG) 来检测“仍在运行”的情况,这很有帮助,因为看起来进程总是在读取所有内容后终止。如果 pid 仍在运行,waitpid 返回 0。但是,它不是 EOF,总比没有好,但我仍在寻找其他输入。这显然不理想。

更新 2:这个问答帮助解决了我问题的 EOF 部分,虽然不完美,但更好: How epoll detect clientside close in Python?

最佳答案

如果它在 WIN32 环境中受支持,并且您的进程正在生成子进程,您可以尝试设置一个信号处理程序来捕获来自父进程中生成的进程的 SIGCHLD 信号...类似于:

$SIG{CHLD} = sub { 打印“从子进程中捕获信号”; };

这应该会告诉您是否有一个子进程退出。

关于windows - 套接字对、perl、KEEPALIVE 和轮询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1908329/

相关文章:

mysql - 减少 DBI::common::Fetch 的调用 (Perl)

ios - 为什么 Apple 简单 ping 在 iOS 上不起作用?

windows - 使用 Python 3 将 LF 打印到 Windows stdout

windows - Windows 应用程序中的日志记录(跟踪)指南

perl - 使用 Perl 并发追加到同一个文件

windows - Perl Net::SFTP::Foreign Plink 连接问题

c - 如何同时从标准输入和套接字进行轮询?

linux - UDP广播和单播通过同一个套接字?

c - 0A 转换为 C 中的 0D0A

c# - FileSystemWatcher,奇怪的 react