代码之家  ›  专栏  ›  技术社区  ›  dlamotte

套接字对、perl、KEEPALIVE和轮询

  •  2
  • dlamotte  · 技术社区  · 16 年前

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

    我的问题是kill(0,…)在windows上不起作用,所以我需要另一种方法来检测进程是否停止。我调查了Sou KEEPALIVE,但这似乎对袜子不起作用。。。我使用了setsockopt(…),然后使用了getsockopt(…),并且在调用setsockopt()之前和之后都关闭了SO_KEEPALIVE选项。

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

    • 无法检测进程是否死亡(终止(0,…)不工作)

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

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

    How epoll detect clientside close in Python?

    2 回复  |  直到 9 年前
        1
  •  0
  •   mob    16 年前

    在Linux中,您可以将套接字设置为非阻塞(因为至少5.8):

     $socket->blocking(0);   # or (*SOCKET)->blocking(0);
    

    这在Windows上不起作用(在5.10中可能起作用),但在尝试读取套接字之前,可以使用4-arg select调用查看套接字上是否有输入(在Windows中,4-arg select仅适用于socketHandle,而不适用于文件句柄或管道)。

    如果仍然需要判断Windows进程(具有已知PID)是否处于活动状态,请签出 Win32::Process::Open method ,它将尝试打开windows进程的句柄,失败时返回零。


    编辑: 我之前没有注意到您说过套接字来自子进程。那样的话,你可以打个电话

    waitpid $pid, WNOHANG;   # and    use POSIX ':sys_wait_h'
    

    waitpid 不返回-1,你知道这个过程是死的。

        2
  •  1
  •   Aquatoad    16 年前

    如果在WIN32环境中受支持,并且您的进程正在生成子进程,则可以尝试设置一个信号处理程序,以从父进程中生成的进程捕获SIGCHLD信号。。。比如:

    打印“从子进程捕获的信号”; };