Tag: win32 process

重新启动Windows进程,保留进程ID和句柄

我创建了一个Windows可执行文件,作为某些嵌入式设备的模拟器(所有业务逻辑与原始设备完全相同,只有硬件相关的东西是存根的)。 此模拟需要不时重置,在“正常”用例中,它会执行以下操作: //some global environment … int main(int argc, char* argv[]) { __debugbreak(); //… do some stuff //if( restart needed ){ printf(“before _execv”); _execv(argv[0], argv); //”reset” simulated device //} //… do some other testing stuff return 0; } 注意:上面的代码仅用于说明主要思想,在实际应用中, execv调用实际上位于HW_Reset()存根中,即从原始代码中的多个位置调用。 问题是Windows上的_execv在Linux上的行为与execv完全不同:当我在Visual Studio中调试此应用程序时, _execv不会用“重新启动”的图像替换当前的过程映像。 相反,它只是创建一个带有新ID的新进程并终止当前进程,导致将其从Visual Studio中分离出来,因此,要保留我需要一次又一次地重新连接到该新进程的所有断点(在单个调试会话中有几十次重新启动) )。 目前我使用__debugbreak()作为解决方法。 其他选项是通过重新初始化全局环境并使用setjmp / longjmp的某种组合来重置模拟 – 但是全局环境和相应的初始化程序通过原始文件的thousends传播,并且大多数是静态的,因此无法手动处理此类重置(我也不允许编辑原始文件)。 所以问题是:是否有一些Windows API /通用解决方法通过重置所有全局(和静态)变量导致当前进程“就地”重新启动,例如,如果可以在同一地址内重新加载相同的进程映像空间,保留向外可观察的进程ID,进程句柄和与visual […]

即使在孩子终止后,Win32,来自管道块的ReadFile

我有一个简单的程序(在C中)创建两个子进程,每个等待inheritance的管道,并将输出放在一个文件中。 一切都运行良好,除了在两个管道上的一些写/读周期后,当孩子结束时,调用ReadFile块,等待管道上的数据。 我使用以下模式: … //create pipe1 CreatePipe(&hReadDup,&hWrite,&saAttr,0); DuplicateHandle(GetCurrentProcess(),hReadDup,GetCurrentProcess(),&hRead,0,FALSE,DUPLICATE_SAME_ACCESS); CloseHandle(hReadDup); si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES; si.hStdOutput = hWrite; CreateProcess( NULL, const_cast(cmd2.c_str()), //the command to execute NULL, NULL, TRUE, 0, NULL, NULL, &si, //si. &pi ); … CloseHandle(hWrite); // EDIT: this was the operation not properly done! while(cont){ … cont = ReadFile(hRead,buf,50, &actual,NULL); … } … […]

timespec相当于windows

我正在从unix移植我的应用程序到windows ,我遇到了一堵墙。 在我的应用程序中,我需要在几微秒内找到时间(整个应用程序在很大程度上依赖于它,因为它是一个高精度的应用程序)。 以前我使用的是timespec结构,但是Windows不包含这样的东西。 命令GetTickCount是不够的,因为它以毫秒为单位返回时间。 我也在考虑QueryPerformanceFrequency 。 有没有人碰巧知道与timespec尽可能相同的东西,将来我甚至可能需要纳秒,这在Windows支持中没有找到任何东西。 感谢任何人的帮助