运行Windows程序并检测它何时以C++结尾

问题描述:

假设我运行一个应用程序,此应用程序在一段时间后将被用户关闭。有没有可能找出程序何时退出?当我运行该应用程序时,我可以得到它的进程ID吗?运行Windows程序并检测它何时以C++结尾

+0

你在说什么操作系统?你如何运行这个过程?它是你的程序通过exec,fork来运行另一个进程吗? – 2009-12-04 11:31:23

+0

windows,我想在我的C++应用程序中运行该应用程序。 – EBAG 2009-12-04 11:32:53

这是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(); 
} 
+0

干净。谢谢。有没有办法跟踪CPU,I/O使用情况以及创建的进程的状态? – 2011-03-03 11:37:34

+0

看看这个问题http://*.com/questions/2475341/monitoring-cpu-and-disk-utilization-of-a-single-program – 2011-03-03 15:00:20

在Windows上,您可以使用WaitForSingleObject来实现此功能。

在在谷歌快速搜索,我发现从MSDN这两种方法可以是有用的:

CreateProcessGetExitCodeProcess。这假设你正在你的应用程序中创建一个进程。

您可以执行轮询方法来检查创建的进程状态。我从来没有做过这种事,但对我来说似乎是一种非常奇怪的做法。

的CreateProcess和WaitForSingleObject的是简单的方式来实现这一点:你从CreateProcess的获取进程句柄,然后等待它WFSO,不要忘记关闭任何手柄你用。但是请稍等......有一个问题。问题是 - 对于GUI进程 - 这两个进程都可能挂起。为什么?

问题出现是因为您的应用程序有一个窗口,但没有泵送消息。如果生成的应用程序使用其中一个广播目标(HWND_BROADCASTHWND_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"); 
}