Articles of createprocess

在新进程中运行方法并等待它们完成

我需要我的应用程序能够在一个新的过程下运行一些方法,理想情况下,能够从这些方法获得返回值,但我还没有find我如何做到这一点(我的C + +知识是相当基本的)。 所以说得更好,比方说我有方法A,A1和A2。 方法A将开始执行,并在某个时候会: 在新的进程下运行方法A1 等待A1完成,并可能得到返回值 在另一个新进程下运行方法A2 等待A2完成并再次获得返回值 在原始进程下继续运行代码 我发现我可以使用fork()在subprocess中运行代码,但是这不适合我的需求,因为它似乎是创build父进程的副本,而不仅仅是运行我只希望在新进程中的特定代码。 这里是我试过的一个摘录,我不知道是否可以修改它来做我想做的事,或者如果我完全使用其他的东西: int main(){ std::cout << "START" << std::endl; test1(); test2(); std::cout << "FINISH" << std::endl; return 0; } void test1(){ pid_t pid = fork(); if (pid == 0){ int i = 0; for (; i < 5; ++i) { std::cout << "Test 1 " […]

检查以前由应用程序启动的进程总是返回进程活着

我正在用CreateProcess创build一个进程: 带有标志CREATE_NO_WINDOW | CREATE_BREAKAWAY_FROM_JOB | CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS CREATE_NO_WINDOW | CREATE_BREAKAWAY_FROM_JOB | CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS InheritHandles param = TRUE startupinfo stdout和stderr文件redirect( STARTF_USESTDHANDLES ) SECURITY_ATTRIBUTES.InheritHandle = TRUE 该进程的句柄在继续执行的同时closures。 然后我通过获取具有给定PID的进程的句柄来检查进程状态: HANDLE HProcess = OpenProcess( PROCESS_QUERY_INFORMATION , TRUE, task->taskPid); 编辑 :是的,我正在检查返回的过程是否真的是我查询的过程: if ( ( HProcess != NULL ) && ( GetProcessId(HProcess) != requestedPid ) ) 无论创build的stream程是否真的在运行,我都会得到有效的stream程。 如果我重新启动我的应用程序,检查代码正常工作。 我怀疑这个句柄是以某种方式缓冲的,或者是创build的过程在同一个组中,但是我似乎无法在文档中find任何关于它的信息。

使用ChildProcess启动进程时,“系统找不到指定的文件”

当我运行下面的代码: require 'childprocess' process = ChildProcess.build("cucumber") process.start (似乎任何其他的gem可以代替黄瓜) 我收到错误: C:/Ruby193/lib/ruby/gems/1.9.1/gems/childprocess-0.3.3/lib/childprocess/windows/process_builder.rb:87:in `create_process': The system cannot find the file specified. (2) (ChildProcess::LaunchError) from C:/Ruby193/lib/ruby/gems/1.9.1/gems/childprocess-0.3.3/lib/childprocess/windows/process_builder.rb:34:in `start' from C:/Ruby193/lib/ruby/gems/1.9.1/gems/childprocess-0.3.3/lib/childprocess/windows/process.rb:63:in `launch_process' from C:/Ruby193/lib/ruby/gems/1.9.1/gems/childprocess-0.3.3/lib/childprocess/abstract_process.rb:67:in `start' from env.rb:4:in `<main>' 当我使用例如cucumber在Windows cmd中运行它时,进程正常启动。 我该如何解决? 为什么发生?

Windows API作业对象:不要传递给孙子们

我有一个Windows命令行应用程序child.exe ,我希望为其创build一个包装器parent.exe 。 我通过使用CreateProcess从父项产生子项来完成此操作: int wmain(int argc, WCHAR *argv[]) { STARTUPINFO startupInfo = createStartupInfo(); PROCESS_INFORMATION processInfo = {0}; if(CreateProcessW( L"C:\\child.exe", NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInfo )) { WaitForSingleObject(processInfo.hProcess, INFINITE); CloseHandle(processInfo.hThread); CloseHandle(processInfo.hProcess); return 0; } else { return -1; } } STARTUPINFO createStartupInfo() { // Create and return a STARTUPINFO structure… } […]

用于Windows的可执行包装的CreateProcess用法?

TL; DR : CreateProcess(?, ?, ?, …)用于: 传递当前进程参数(即“batchfile” %* ) 正确连接标准input和标准输出 创build标志? 我有以下问题: 我需要启动一个给定的第三方可执行文件与自定义的环境和自定义参数。 (两个半固定) 我不能使用batch file,因为调用模块的(再次,第三方)方直接调用CreateProcess 我需要传递任何传递的参数 所以,我想要做的是创build一个非常简单的可执行文件启动程序,这将是一个batch file的等价物: set PATH=… set WHATEVER=… …\3rd-pty-tool.exe -switch1 -switch2 %* exit /B %ERRORLEVEL% 我当然不想把任何bat2exe转换器的东西搞砸了 – 反正当我有Visual Studio的时候太难看了。 原则上 通过CreateProcess运行另一个可执行文件是微不足道 的 : STARTUPINFO info={sizeof(info)}; PROCESS_INFORMATION processInfo; if (CreateProcess(?, ?, ?, ?, ?, ?, ?, ?, &info, &processInfo)) { […]

CreateProcessWithLogonW()问题 – 需要用同一个用户启动subprocess

我有一个Windows可执行文件通过调用CreateProcessWithLogonW()与一组指定的用户详细信息从一个服务中启动。 这工作正常,并按预期的过程开始。 然而,当这个进程试图启动其他进程本身,目前只是使用CreateProcess()这些开始,然后直接死掉 – 它们是需要桌面访问的可执行文件。 阅读了关于CreateProcess()的微软文章之后 – http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx 我想可以看出为什么会发生这种情况,这在某种程度上是有道理的。 CreateProcess()知道调用进程是模拟一个用户,所以它使用它的父进程,在本例中是本地系统帐户。 但是当然,在本地系统帐户中运行的任何东西都不具有我们需要的访问权限,所以启动的进程将会死亡。 奇怪的是,当我以前使用LogonUser()和CreateProcessAsUser()来启动服务中的初始可执行文件时,它工作正常。 但是由于没有正确的权限问题,我不得不将其更改为CreateProcessWithLogonW()。 有没有人知道这个解决scheme? 我已经看到在networking上的其他地方谈论这一点,但没有任何明确的解决办法。 看起来好像我可能需要在CreateProcessWithLogonW()中login的用户的标记,以便以后可以使用它来启动其他进程? 但是我没有办法获得这个令牌,可以以任何方式为当前用户提取吗? 任何帮助将不胜感激,谢谢:)

有关进程访问权限的问题

我有以下情况: 处理创build处理B,然后B尝试使用OpenProcess()获取A的句柄。 我希望B拥有A的PROCESS_ALL_ACCESS权限。 我应该如何做到这一点? 谢谢。

创build一个不属于创build过程的subprocess

我正在开发一个应用程序,在这个应用程序中,一个进程的实例A依赖于一个进程的单个实例B.这个想法是,进程A的一个实例启动进程B,这样A的所有实例都可以用它。 A的实例被托pipe在第三方进程中,并且可以在不可预知的时间点(通过杀死进程树)被拆除。 因此,过程B不是过程A的任何实例的孩子是至关重要的。 我已经尝试使用PInvoke来调用CreateProcess,在创build标志中指定DetachedProcess(0x08),但是这不起作用(请参阅下面的代码)。 [DllImport("kernel32.dll")] private static extern bool CreateProcess(string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes, IntPtr lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory, [In] ref StartupInfo lpStartupInfo, out ProcessInformation lpProcessInformation); public Process LaunchProcess(Path executablePath, string args) { StartupInfo sInfo = new StartupInfo(); const uint creationFlags = (uint)(CreationFlags.CreateNoWindow | CreationFlags.DetachedProcess); ProcessInformation pInfo; bool success […]

从PHP执行程序挂起APACHE

你好,并提前感谢您的兴趣。 在过去的两个星期里,我一直在苦苦挣扎, 我在Windows上安装了APACHE(2.2.22)和PHP(5.4.3),我试图从一个PHP脚本中调用另一个程序的程序。 这两个程序都用C / C ++编写,并用MINGW32编译。 对于Windows版本,我testing了Windows 2003 Server和Windows 7 Professional,两者都给我提出了相同的问题。 让我介绍这两个scheme: 1)mytask.exe:这是一个程序,将在后台执行,并周期性地将其状态填充到一个文件。 2)job.exe:这是我想从PHP脚本调用的程序。 它的目标是产生mytask.exe作为一个独立的进程(而不是一个线程)。 如果我从控制台窗口运行下面的命令,那么job.exe会立即返回,并使mytask.exe在后台运行,直到它终止。 > job.exe spawn mytask.exe jobid=18874111458879FED 请注意,job.exe会转储用于pipe理mytask.exe的标识符。 例如: > job.exe status 18874111458879FED RUNNING 我已经检查过,如果我从PHP脚本运行第一个命令,PHP脚本会永远随机阻止。 如果我查看Windows的任务pipe理器,我可以看到job.exe处于僵尸状态。 我可以断言job.exe有效地达到了平常的return 0; 声明在main()例程中,所以它似乎是在C运行时的木头之下的东西。 此外,如果我写一个简单的睡眠10秒的简单mytask.exe,那么PHP脚本也会阻塞10秒(或者在我刚刚提到的随机行为之后永远阻塞)。 换句话说,当我从PHP脚本调用job.exe时,我无法让job.exe产生一个进程而不用等待它结束。 所以:当产生mytask.exe的时候,我做错了什么,现在,这里是第二部分。 我使用WINAPI函数CreateProcess()从job.exe产生任务。 在MSDN文档中,我使用bInheritHandles = FALSE调用CreateProcess,以避免subprocess使用PHP脚本产生I / O死锁。 我也closures了PROCESS_INFORMATION结构中由CreateProcess()返回的进程句柄。 我唯一不做的就是等待这个过程结束。 另一方面,关于PHP方面,我已经尝试了exec()和proc_open() PHP函数来调用job.exe没有成功。 但是,我最后的观察似乎是正确的,但是他们没有说服我,因为我不明白他们为什么要工作。 事实是,如果mytask.exe在睡眠之前做了fclose(stdout) ,那么PHP脚本立即返回。 但是,如何? 我告诉CreateProcess()不能inheritance句柄,为什么我会得到这些结果呢? 无论如何,我不能坚持这个补丁,因为job.exe启动的程序可能不知道谁在调用它们,所以从这些程序closuresstdout不是一个好的解决scheme。 在UNIX中,事情非常简单…只需调用fork() ,closures标准stream,然后调用execve来调用程序。 […]

CreateProcess钩子添加CommandLine

我有一个项目是添加一些特定的标志(命令行)到Chrome浏览器,问题是我正在通过创build一个新的Chrome快捷方式,我想要执行的标志这样做。 在最后的日子里,这个解决方法变得太肤浅了,我被要求做更深入的事情。 在Windowsregistry,我没有find任何好的解决scheme, 总是有人运行Chrome时添加此标志,所以我开始考虑挂钩CreateProcess到浏览器,并检查是否即将运行的过程是铬,然后我添加lpCommandLine属性中的标志。 我知道挂钩到资源pipe理器是一个相当“侵入”的解决scheme,但这变得很有帮助,因为我有一些其他的实现,我正在推迟这个项目,挂钩将帮助我完成所有的工作。 我得到了钩子的工作,我尝试了很多方式来添加命令行,当铬find,但没有成功…现在(我试过至less8种不同的解决scheme)我的绕道function是: function InterceptCreateProcess(lpApplicationName: PChar; lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: PChar; const lpStartupInfo: STARTUPINFO; var lpProcessInformation: PROCESS_INFORMATION): BOOL; stdcall; var Cmd: string; begin Result:= CreateProcessNext(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation); if (POS(Chrome, UpperCase(String(lpApplicationName))) > 0) then begin Cmd:= ' –show-fps-counter'; […]