【问题标题】:Using windows sockets for a new process I/O使用 Windows 套接字进行新进程 I/O
【发布时间】:2013-12-17 10:55:01
【问题描述】:

在调用CreateProcess() 时,对可用于重定向的 I/O 内核对象的类型是否有任何限制?

documentation 中可以看出,函数接收的参数之一是STARTUPINFO 结构。在这个结构中,可以为输入、输出和错误指定句柄。但是,没有提到可以使用哪些特定类型的 I/O 内核对象。

我已经测试了将 windows 套接字用作 I/O 设备,并发现它可以工作。但是,我认为这种设备的性质与文件对象有很大不同,这让我想知道是否真的打算将套接字用于此目的。

【问题讨论】:

    标签: c windows sockets io createprocess


    【解决方案1】:

    好吧,我不确定我是否在回答您的问题,但就继承而言,根据 MSDN 文档所述,可以通过 SetHandleInformation() 修改套接字的继承策略。这样可以防止子进程继承父进程的监听套接字。

    【讨论】:

      【解决方案2】:

      我不相信这是记录在案的。

      但是,通常的做法是,标准 I/O 句柄可以是任何诸如 TCP/IP 套接字、COM 或 LPT 端口、文件、管道等的流设备。我相信 MSDN 上有针对其中几种情况的示例代码。

      (默认的标准 I/O 句柄是针对控制台的,而不是针对文件的,因此我们至少可以安全地假设它们不必是文件句柄!)

      【讨论】:

        【解决方案3】:

        当使用STARTF_USESTDHANDLESCreateProcess() 指定STDIN/OUT/ERR 句柄时,它们应该是与CloseHandle() 兼容的有效内核对象(因为这在STARTUPINFO documentation 中有很多说明)。套接字不是内核对象,不符合CloseHandle() 的要求(尽管套接字可以与ReadFile()WriteFile() 内核函数一起使用)。

        当调用者代表套接字连接启动重定向进程时,典型情况是调用者通过CreatePipe()使用匿名管道进行重定向,然后根据需要在套接字连接和管道之间代理数据.

        话虽如此,another question 的答案之一表明可以使用套接字进行重定向,但前提是套接字是使用 WSASocket() 创建的且省略了 WSA_FLAG_OVERLAPPED 标志,因为重定向不允许要使用的重叠手柄。我自己没有亲自尝试过这种解决方案,所以我不知道它是否有效。为了安全起见,最好改用管道,尤其是在您无法控制(或不知道)套接字是如何创建的情况下。

        【讨论】:

        • 套接字绝对有效。我在这里使用了这种方法:github.com/cubiclesoft/createprocess-windows
        • @CubicleSoft:是的,有时使用套接字是“有意义的”,就像在 CGI 应用程序中一样,但仅仅因为它“有效”并不一定意味着它是“官方支持的”。在任何 MSDN 文档中都没有说套接字可以直接用于重定向。
        猜你喜欢
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 2015-06-23
        • 1970-01-01
        • 2012-08-23
        • 2012-02-22
        • 2012-03-30
        • 1970-01-01
        相关资源
        最近更新 更多