C Win32:匿名继承管道不';t在子进程退出时关闭

C Win32:匿名继承管道不';t在子进程退出时关闭,c,windows,winapi,C,Windows,Winapi,我一直试图使用匿名管道通过其stdin和stdout与派生的子流程进行通信,类似于。到目前为止,一切都很好-我通过WriteFile()与它通信,然后通过PeekNamedPipe()和ReadFile()从中读取数据。生活是美好的 但是,我遇到了一些令人不安的事情-当子进程意外关闭时,对WriteFile()的父进程调用似乎永远不会返回任何类型的失败状态,表明管道已关闭,我的父进程愉快地继续写数据,直到我溢出管道的内部缓冲区并永远阻塞为止 我的设置代码如下所示: // Set up pipes

我一直试图使用匿名管道通过其stdin和stdout与派生的子流程进行通信,类似于。到目前为止,一切都很好-我通过WriteFile()与它通信,然后通过PeekNamedPipe()和ReadFile()从中读取数据。生活是美好的

但是,我遇到了一些令人不安的事情-当子进程意外关闭时,对WriteFile()的父进程调用似乎永远不会返回任何类型的失败状态,表明管道已关闭,我的父进程愉快地继续写数据,直到我溢出管道的内部缓冲区并永远阻塞为止

我的设置代码如下所示:

// Set up pipes
SECURITY_ATTRIBUTES sec_attrs;
memset(&sec_attrs, 0, sizeof(SECURITY_ATTRIBUTES));
sec_attrs.nLength = sizeof(SECURITY_ATTRIBUTES);
sec_attrs.bInheritHandle = TRUE;
sec_attrs.lpSecurityDescriptor = NULL;

if (!CreatePipe(&midi_process_in_reader, &midi_process_in_writer, &sec_attrs, 0))
{
    DEBUGOUT("Could not initialize midiproc stdin");
    return false;
}

if (!SetHandleInformation(midi_process_in_writer, HANDLE_FLAG_INHERIT, 0))
{
    DEBUGOUT("Could not disinherit midiproc stdin");
    return false;
}

if (!CreatePipe(&midi_process_out_reader, &midi_process_out_writer, &sec_attrs, 0))
{
    DEBUGOUT("Could not initialize midiproc stdout/stderr");
    return false;
}

if (!SetHandleInformation(midi_process_out_reader, HANDLE_FLAG_INHERIT, 0))
{
    DEBUGOUT("Could not disinherit midiproc stdin");
    return false;
}

// Launch the subprocess
PROCESS_INFORMATION proc_info;
memset(&proc_info, 0, sizeof(proc_info));

STARTUPINFO startup_info;
memset(&startup_info, 0, sizeof(startup_info));
startup_info.cb = sizeof(startup_info);
startup_info.hStdInput = midi_process_in_reader;
startup_info.hStdOutput = midi_process_out_writer;
startup_info.dwFlags = STARTF_USESTDHANDLES;

BOOL ok = CreateProcess(TEXT(module), TEXT(cmdline), NULL, NULL, TRUE,
    CREATE_NEW_CONSOLE, NULL, NULL, &startup_info, &proc_info);
我能看到的示例和代码之间的唯一区别是我没有连接stderr-我想保留它以进行fprintf调试


从长远来看,我可能需要使用某种“心跳”消息,因为子进程可能会变成僵尸,完全处于活动状态,保持其句柄打开,但从不读取stdin,这将以不同的方式插入内容。但是,我想确保我在理解Windows上的匿名管道时没有遗漏任何东西。

调用
CreateProcess()
后,必须关闭
midi\u进程\u in\u reader
midi\u进程\u out\u writer
。您的问题不是因为“继承的管道在子流程退出时不关闭”,而是因为您忘记在自己的流程中关闭管道