启动新的可执行文件后C++程序未退出



考虑两个C++项目:

项目 1:

// projectOne.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "windows.h"
int _tmain(int argc, _TCHAR* argv[])
{
    Sleep(5000);
    system("projectTwo.exe");
    return 0;
}

项目2:

// projectTwo.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "windows.h"
int _tmain(int argc, _TCHAR* argv[])
{
    Sleep(5000);
    system("projectOne.exe");
    return 0;
}

我寻求的行为是:projectOne开始=>开始projectTwo=> projectOne结束=> projectTwo将启动项目一个=> projectTwo结束=> projectOne将开始projectTwo

但是,这些计划并没有结束。例如,当projectOne projectTwo启动时,它不会projectOne projectOne内运行时return 0;结束。因此,几分钟后,将同时运行多个版本的程序。我以为这与system命令有关。也许它会等到项目完成,直到它进入下一行代码,这会导致盘旋,但我不确定。我该如何解决这个问题?我需要在使用 system 命令调用其中一个程序后结束程序。我希望这个问题是清楚的。

system阻塞正在运行的线程,直到system返回,system在执行的进程终止之前不会返回。

有很多方法可以解决这个问题。最简单且最有可能可移植的是使用 std::thread 在与主处理线程并发运行的线程中运行system

std::thread procthread([processToRun] {system(processToRun.c_str());});
procthread.detach(); 

简短,甜美,并且像任何呼叫system一样便携。第一行创建一个线程并执行一个 lambda 函数,该函数system在提供的进程名称上运行。第二行断开线程与std::thread对象的连接,并允许线程自由运行。否则,如果procthread超出范围,线程将被终止,并且很可能会发生坏事。

如果由于开发系统不支持 C++11 或更高版本而无法执行此操作,则可以使用特定于操作系统的线程,但如果必须使用特定于系统的线程创建调用,则不妨使用特定于系统的进程创建调用直接创建新进程。

在POSIX系统中,posix_spawn可能是首选功能。我目前没有一台机器可以对此进行测试,所以我将链接到使用 posix_spawn 启动进程。

在 Windows 下,使用 CreateProcess 或您选择的变体。以下代码基于 Microsoft 的"创建进程"文档页面,并进行了修改,使其不那么Microsoft具体,并且不等待生成的进程完成再继续执行。

char processToRun[] = "process to run"; //NOTE: Not a std::string!
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
memset(&pi, 0, sizeof(pi));
// Start the child process.
if (!CreateProcess(NULL, // No module name (use command line)
                   processToRun, // Command line DANGER! won't accept const char* 
                                 // cannot use std::string::c_str
                   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
{
    std::cerr << "CreateProcess failed ("<<GetLastError()<<").n";
    return false;
}
// do stuff
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return true;

你的方法是一个无休止的循环,它不会结束!!

您正在生成项目一和项目二的多个实例,而这些实例又会创建更多。它是递归的 -_-

编辑

系统等待


溶液

int execl(char * pathname, char * arg0, arg1, ..., argn, NULL);

最新更新