使用C ++从线程启动应用程序

时间:2011-01-18 14:21:09

标签: c++ process launching-application

我需要在一个线程中启动一个第三方程序,等待从stdout / stderr用C ++获得结果。

  • 有哪些方法?
  • 他们是跨平台的吗?我的意思是,我可以将它们用于cl / gcc吗?

3 个答案:

答案 0 :(得分:1)

有一组posix函数可以启动外部可执行文件 - 请参阅exec - 这是跨平台的。要在Windows上执行某些特定任务,您可能需要使用特定于Windows的createprocess

这些通常会阻止,因此您必须在新线程中启动它们。线程通常不是跨平台的,尽管你可以在windows上使用posix(pthreads)。

另一种方法是使用像Qt或wxWidgets跨平台库这样的东西。

答案 1 :(得分:1)

系统应该是独立于平台的,但如果担心运行具有相同安全权限的程序,您可能希望坚持使用createprocess(win)/ exec(其他)。

答案 2 :(得分:1)

在Unix上:

http://linux.die.net/man/3/execl

#include <sys/types.h>
#include <unistd.h>

void run_process (const char* path){
    pid_t child_pid;

    /* Duplicate this process.  */
    child_pid = fork ();

    if (child_pid != 0){
        /* This is the parent process.  */

        int ret = waitpid(child_pid, NULL, 0);

        if (ret == -1){
            printf ("an error occurred in waitpid\n");
            abort ();
        }
    }
    else {
        execl (path, path);
        /* The execvp function returns only if an error occurs.  */
        printf ("an error occurred in execl\n");
        abort ();
    }

}

在Windows上:

http://msdn.microsoft.com/en-us/library/ms682425%28v=vs.85%29.aspx

# include <windows.h>

void run_process (const char* path){
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    bool ret = = CreateProcess(
            NULL,          // No module name (use command line)
            path,          // 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
        )

    if (!ret){
        printf("Error");
        abort();
    }

    WaitForSingleObject(pi.hProcess, INFINITE);

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

}