有没有办法调用CreateProcess,以便杀死父进程自动杀死子进程?
也许使用Create Process Flags?
编辑
解决方案是创建作业对象,将父级和子级放在作业对象中.当父母被杀后,孩子被杀.我从这里得到了代码:
当父进程被杀死时杀死子进程
记下@wilx关于继承句柄的注释.
我有一个简单的程序(在C中)创建两个子进程,每个等待一个继承的管道,并将输出放在一个文件中.
一切都运行良好,除了在两个管道上的一些写/读周期后,当孩子结束时,调用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<LPWSTR>(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);
...
}
...
Run Code Online (Sandbox Code Playgroud)
最后一次调用(子进程退出后)阻止.想法为什么(如果不是,如何调试)?
我有2个进程(A,B)共享相同的互斥锁(使用WaitForSingleObject/ReleaseMutex调用).一切正常,但当进程A崩溃时,进程B正在快乐地哼唱.当我重新启动进程A时,会出现死锁.
更深入的调查显示,在进程A崩溃后,进程B可以成功调用ReleaseMutex()两次.
我的解释:在进程A崩溃后,互斥锁仍然被锁定,但是互斥锁的所有权很容易转移到进程B(这是一个错误).这就是为什么它快乐地哼着,调用WaitForSingleObject(得到WAIT_OBJECT_0)和ReleaseMutex(得到TRUE作为回报).
是否可以使用类似于Mutex的命名同步原语,以便进程A中的崩溃将释放互斥锁?
一种解决方案是使用SEH并捕获崩溃并释放互斥锁,但我真的希望Windows有一个健壮的原语,它不会像进程崩溃那样死锁.
任何人都可以提供更改进程优先级的代码的Delphi示例吗?
我需要从Windows XP任务管理器获取名称进程,并使用delphi代码更改其优先级.
目前我在一个命令提示符下执行此操作
require 'win32/process'
p = Process.spawn("C:/ruby193/bin/bundle exec rails s")
puts p
Process.waitpid(p)
Run Code Online (Sandbox Code Playgroud)
然后在另一个
require 'win32/process'
Process.kill(1,<p>)
Run Code Online (Sandbox Code Playgroud)
问题是我生成的进程(在这种情况下是Rails服务器)产生了一系列子进程.kill命令不会杀死它们,只是让它们孤立而没有父级.
任何想法如何杀死整个衍生过程及其所有孩子?
我有一个vs项目,一旦升级到visual studio 2012就无法编译.它是一个win32 dll项目,它抱怨def文件.这是def文件,
LIBRARY test.dll
VERSION 3.1.4.1
EXPORTS
addNumbers @1
Run Code Online (Sandbox Code Playgroud)
这是我在visual studio 2012 ultimate中编译项目时遇到的错误.
Source.def(2): fatal error LNK1118: syntax error in 'VERSION' statement
Run Code Online (Sandbox Code Playgroud)
让我感到困惑的是,这与视觉工作室2008和2010完美搭配.
知道这里出了什么问题吗?
谢谢Sunil
我找到了许多来源来获取每个进程的CPU使用率.一般来说,有很多方法可以获得进程的CPU使用率.
FirstWay:
对于远程进程监视(我的方案是远程监视),percentprocessortime始终显示0到100+的值.由于系统中有多个处理器,因此会发生这种情况.它可以使用percentprocessortime/processorcount计算.
问题首先:
我可以在wmi explorer中读取percentprocessortime,它显示的所有值都是0或100,只是不是这个值.这个值是对的吗?或者它对监测价值有用吗?
第二种方式:
对于PerformanceCounter类监视,它只能在本地完成.所以我不能用这个.是否有可能将其用于远程?
第三种方式:
(这里使用的公式最大的困惑.)这个计算是由PerformanceCounter类或wmi的win32_process类进行的.有些人说使用以下方法来计算性能计数器
考虑单CPU和
(处理器\%处理器时间)= 10%
(处理器\%用户时间)= 8%
(处理器\%特权时间)= 2%
(进程\%处理器时间\您的应用程序)= 80%
您的应用程序使用80%(处理器\%用户时间),即(8*.8)= CPU的6.4%.
更多参考这里.
通过使用以下公式从win32_process计算usermodetime和kernelmodetime
DateTime firstSample, secondSample;
firstSample = DateTime.Now;
queryObj.Get();
//get cpu usage
ulong u_oldCPU = (ulong)queryObj.Properties["UserModeTime"].Value
+(ulong)queryObj.Properties["KernelModeTime"].Value;
//sleep to create interval
System.Threading.Thread.Sleep(1000);
//refresh object
secondSample = DateTime.Now;
queryObj.Get();
//get new usage
ulong u_newCPU = (ulong)queryObj.Properties["UserModeTime"].Value
+ (ulong)queryObj.Properties["KernelModeTime"].Value;
decimal msPassed = Convert.ToDecimal(
(secondSample - firstSample).TotalMilliseconds);
//formula to get CPU ussage
if (u_newCPU …Run Code Online (Sandbox Code Playgroud) 对于某些使用64位变量的CPU绑定代码,使用Amd64指令集而不是x86是有益的.如何在32位Windows(例如Windows XP SP3)下完成?当然,我假设一个现代的,支持Amd64的CPU.我排除了工作但重量级的方法:将完整的64位操作系统作为虚拟机运行,例如在Virtualbox下运行Amd64的Ubuntu.
我知道需要一些程序集,并且会有限制,特别是解决比32位Windows管理更多的内存.但我正在考虑纯粹的计算任务,只需要适量的内存而不需要调用外部函数.
我移植我的应用程序,以windows从unix,我已经碰壁.在我的应用程序中,我需要在几微秒内找到时间(整个应用程序在很大程度上依赖于它,因为它是一个高精度的应用程序).
以前我使用的是timespec结构,但是Windows不包含这样的东西.该命令GetTickCount不够用,因为它以毫秒为单位返回时间.我也在考虑QueryPerformanceFrequency.
有人会碰巧知道尽可能相同的东西timespec吗?
在未来,我甚至可能需要纳秒,我在Windows中搜索的任何内容都不支持.