运行Windows程序并检测它何时以C++结尾
这是here报价:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
void _tmain(int argc, TCHAR *argv[])
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
STARTUPINFO sj;
PROCESS_INFORMATION pj;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&sj, sizeof(sj));
sj.cb = sizeof(sj);
ZeroMemory(&pj, sizeof(pj));
// Start the child process p1.exe. Make sure p1.exe is in the
// same folder as current application. Otherwise write the full path in first argument.
if(!CreateProcess(L".\\p1.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &sj, &pj))
{
printf("Hello CreateProcess failed (%d)\n", GetLastError());
getch();
return;
}
// Start child process p2.exe. Make sure p2.exe is in the
// same folder as current application. Otherwise write the full path in first argument.
if(!CreateProcess(L".\\p2.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
printf("CreateProcess2 failed (%d)\n", GetLastError());
getch();
return;
}
// Wait until child processes exit.
WaitForSingleObject(pi.hProcess, INFINITE);
WaitForSingleObject(pj.hProcess, INFINITE);
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(pj.hProcess);
CloseHandle(pj.hThread);
getch();
}
干净。谢谢。有没有办法跟踪CPU,I/O使用情况以及创建的进程的状态? – 2011-03-03 11:37:34
看看这个问题http://*.com/questions/2475341/monitoring-cpu-and-disk-utilization-of-a-single-program – 2011-03-03 15:00:20
在在谷歌快速搜索,我发现从MSDN这两种方法可以是有用的:
CreateProcess和GetExitCodeProcess。这假设你正在你的应用程序中创建一个进程。
您可以执行轮询方法来检查创建的进程状态。我从来没有做过这种事,但对我来说似乎是一种非常奇怪的做法。
的CreateProcess和WaitForSingleObject的是简单的方式来实现这一点:你从CreateProcess的获取进程句柄,然后等待它WFSO,不要忘记关闭任何手柄你用。但是请稍等......有一个问题。问题是 - 对于GUI进程 - 这两个进程都可能挂起。为什么?
问题出现是因为您的应用程序有一个窗口,但没有泵送消息。如果生成的应用程序使用其中一个广播目标(HWND_BROADCAST
或HWND_TOPMOST
)调用SendMessage,则在所有应用程序都处理完消息之前,SendMessage将不会返回到新应用程序 - 但是您的应用程序无法处理该消息,因为它不是' t泵消息....所以新的应用程序锁定,所以你的等待永远不会成功.... DEADLOCK。
如果您对生成的应用程序具有绝对控制权,那么您可以采取一些措施,例如使用SendMessageTimeout而不是SendMessage(例如,对于DDE启动,如果有人仍在使用它)。但有些情况会导致您无法控制的隐式SendMessage广播,例如使用SetSysColors API。 (a)将Wait分解成单独的线程,(b)在Wait上使用超时,并在Wait循环中使用PeekMessage,以确保泵送消息,(c)使用MsgWaitForMultipleObjects API而不是WaitForSingleObject。
提供更多控制的替代方法是使用Win32 Job API,请参阅CreateJobObject()和AssignProcessToJobObject()。这将允许您使用IO完成端口使用SetInformationJobObject()来异步监控您的衍生进程,它比您需要的更复杂并且可能更多,但它确实可以让您更好地控制产生的进程。
我想提一下,你实际上并不需要创建的一个过程,以便能够等待它的终止。基本上,如果你知道它的PID,你可以这样做:
HANDLE h = OpenProcess(SYNCHRONIZE, TRUE, pid);
WaitForSingleObject(h, INFINITE);
完整的示例:https://gist.github.com/rdp/6b5fc8993089ee12b44d(发表在这里,如果你想提供的编译版本)。
至少在Windows上,有一些(使用不足的)C运行库功能可用于此。 见C Run-Time Library Reference > Process and Environment Control。
具体而言,您有_spawnlp(_P_WAIT, cmdname, arg0, ..., argn, 0)
( “产卵与参数升 IST,使用p ATH变量来查找文件”),该搜索在cmdname PATH和在当前目录。 请注意,“遵循argn,必须有一个NULL指针来标记参数列表的末尾。”
E.g.
#include <stdio.h>
#include <process.h>
int main() {
puts("waiting");
_spawnlp(_P_WAIT, "mspaint.exe", "mspaint.exe", 0);
puts("returned");
}
你在说什么操作系统?你如何运行这个过程?它是你的程序通过exec,fork来运行另一个进程吗? – 2009-12-04 11:31:23
windows,我想在我的C++应用程序中运行该应用程序。 – EBAG 2009-12-04 11:32:53