我有一个父进程,我想将子进程生成一段时间(比如N毫秒)。我在c ++(和windows)中这样做。
我可以向CreateProcess提供一些参数,这些参数会在一段时间后将其终止并将控制权返回给父应用程序吗?如果没有,还有其他办法吗?
答案 0 :(得分:1)
我可以为CreateProcess提供一些参数......?
是的,您可以将所需的duration
(N)参数 lpCommandLine 传递给要启动的进程。
子进程可以解析 lpCommandLine 并设置一个带有所需的计时器
duration
。例如,该计时器可以是Waitable Timer或仅仅是具有
Sleep(duration); // waits the duration
ExitProcess(GetLastError()); // exits the "remote" process
线程(子进程内的线程)在duration
之后终止整个子进程。 WaitableTimer的想法需要频繁调用wait函数。有关详细信息,请参阅Using Waitable Timer Objects。
但是:父流程始终处于“控制中”状态。 但是:您可以另外 在父进程中进入等待状态,使用等待函数(例如WaitForSingleObject),等待子进程句柄实际休眠父进程,直到子进程终止。最后,您可以评估子进程的返回值通过调用GetExitCodeProcess function进行处理。
所描述的方案确保最佳执行所需的duration
,但是,您也可以通过命名事件控制父进程中的duration
。有关详细信息,请参阅Using Event Objects。在这种方法中,父进程可以在消耗duration
“时设置事件。子进程等待该事件,并在设置事件时终止。这种方法可能不太准确,因为父母不太清楚孩子duration
何时开始。
等待计时器的示例:
家长流程:
...
#define CHILD_DURATION 2000 // 2000 ms
HANDLE hProcess;
char ChildName[MAX_PATH];
char CommandLine[MAX_PATH];
sprintf_s(ChildName,MAX_PATH,"MyChild.exe");
sprintf_s(CommandLine,MAX_PATH,"%d",CHILD_DURATION);
// start the child
hProcess = CreateProcess(ChildProcessName,CommandLine,....
if (0 == hProcess)
{
// error with process creation
printf("CreateProcessfailed (%d)\n", GetLastError());
return GetLastError();
}
// and wait for it to finish
if (WAIT_OBJECT_0 == WaitForSingleObject(hProcess,INFINITE)
{
// child finished
} else
{
// error with wait
printf("WaitForSingleObject failed (%d)\n", GetLastError());
return GetLastError();
}
...
子进程:
int main(int argc, char * argv[])
{
HANDLE hWaitableTimer CreateWaitableTimer(NULL,TRUE,NULL);
if (NULL == hWaitableTimer)
{
printf("CreateWaitableTimer failed (%d)\n", GetLastError());
return GetLastError();
}
DWORD dwDuration = atoi(argv[1]);
LARGE_INTEGER liDueTime = -10000 * dwDuration;
// waitable timer due time is in 100 nano second units
// negative values indicate relative time
if (!SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0))
{
printf("SetWaitableTimer failed (%d)\n", GetLastError());
return GetLastError();
}
DWORD dwKeepGoing = TRUE;
// enter the "to do" loop while waiting for the timer...
While (dwKeepGoing)
{
switch (WaitForSingleObject(hTimer,0)
{
case WAIT_OBJECT_0:
// duration over,
// optionally finalize "to do" stuff here
// and end child
dwKeepGoing = FALSE;
case WAIT_TIMEOUT:
// do stuff here
break;
case WAIT_FAILED:
// the wait function has failed
printf("WaitForSingleObject failed (%d)\n", GetLastError());
return GetLastError();
}
}
return 0;
}
答案 1 :(得分:1)
没有人会为你杀死这个过程,除非你自己做(例如从父进程),或者进程退出。
请注意,也没有“并将控制权返回给父应用程序”。一旦子进程启动,父进程和子进程都有自己的“控制”并同时运行,消耗操作系统给进程的CPU时间。
总而言之,您决定谁将终止该过程。如果你是从父进程执行的,那么一旦启动你就会保留子进程句柄并使用(虽然不是一个好主意)TerminateProcess
API用于子进程。
否则,这是更好的一个,子进程本身一直在查看运行时,只是在它的时候退出:
main() {
time_to_exit = now() + N;
while(now() < time_to_exit) {
keep_doing_my_stuff();
}
}