带有参数死锁的 C++ CreateProcess

Posted

技术标签:

【中文标题】带有参数死锁的 C++ CreateProcess【英文标题】:C++ CreateProcess with arguments deadlock 【发布时间】:2017-07-20 10:56:48 【问题描述】:

我有两个应用程序(exe)。

第一个 (client.exe) 只是打印出参数:

#include <iostream>

int main(int argc, char** argv) 

    std::cout << "Have " << argc << " arguments:" << std::endl;
    for (int i = 0; i < argc; ++i) 
    
        std::cout << argv[i] << std::endl;
    

    return 0;

第二个 (SandBox.exe) 使用一些参数执行第一个:

#include <iostream>
#include <Windows.h>

void startup(LPCTSTR lpApplicationName, LPSTR param)

    // additional information
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    // set the size of the structures
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    // start the program up
    CreateProcess(lpApplicationName,   // the path
        param,//NULL,//argv[1],        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi             // Pointer to PROCESS_INFORMATION structure
    );

    // Close process and thread handles. 
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);


int main()

    startup(TEXT("client.exe"), TEXT("client.exe thisIsMyFirstParaMeter AndTheSecond"));
    return 0;

SandBox.exe执行client.exe,输出很奇怪,client.exe永远不会结束,一直处于死锁状态

这里有什么问题?

我期待一些输出,例如(例如当我运行 client.exe 隔离时):

谢谢

【问题讨论】:

你怎么知道是死锁? CreateProcess 的第二个参数必须指向可变字符串,AFAIK。 如果在main() 处理关闭之前使用WaitForSingleObject( pi.hProcess, INFINITE ); 等待客户端进程结束会发生什么? 就是这样@vasek :) 你能把它写成答案,这样我就可以关闭这个帖子了吗? 明确一点:client.exe 确实 以原始版本结尾(它的最终d 可以在C:\&gt; 提示之前看到)问题是因为父进程不等待就立即退出,所以客户端的输出与命令窗口的输出混合在一起。如果父进程也要打印一些文本,您可能会看到类似的内容。 【参考方案1】:

您的控制应用程序应该等到客户端退出。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms682512(v=vs.85).aspx

// start the program up
CreateProcess(lpApplicationName,   // the path
    param,          // Command line
    NULL,           // Process handle not inheritable
    NULL,           // Thread handle not inheritable
    FALSE,          // Set handle inheritance to FALSE
    0,              // No creation flags
    NULL,           // Use parent's environment block
    NULL,           // Use parent's starting directory 
    &si,            // Pointer to STARTUPINFO structure
    &pi             // Pointer to PROCESS_INFORMATION structure
);

// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE ); // <--- this

// Close process and thread handles. 
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);

【讨论】:

以上是关于带有参数死锁的 C++ CreateProcess的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有空格的路径作为参数添加到 CreateProcess 批处理文件?

CreateProcess cmd.exe 读/写管道死锁

Hook CreateProcess

CreateProcess() 不适用于 lpCurrentDirectory

forking() 和 CreateProcess()

CreateProcess() C++ 文件未找到