标签: win32-process

CreateProcess使父进程被杀死时子进程被终止?

有没有办法调用CreateProcess,以便杀死父进程自动杀死子进程?

也许使用Create Process Flags

编辑
解决方案是创建作业对象,将父级和子级放在作业对象中.当父母被杀后,孩子被杀.我从这里得到了代码: 当父进程被杀死时杀死子进程 记下@wilx关于继承句柄的注释.

c++ winapi process win32-process kernel32

16
推荐指数
2
解决办法
1万
查看次数

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

我有一个简单的程序(在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)

最后一次调用(子进程退出后)阻止.想法为什么(如果不是,如何调试)?

c pipe win32-process

11
推荐指数
2
解决办法
7987
查看次数

Win32在进程崩溃时未发布命名的互斥锁

我有2个进程(A,B)共享相同的互斥锁(使用WaitForSingleObject/ReleaseMutex调用).一切正常,但当进程A崩溃时,进程B正在快乐地哼唱.当我重新启动进程A时,会出现死锁.

更深入的调查显示,在进程A崩溃后,进程B可以成功调用ReleaseMutex()两次.

我的解释:在进程A崩溃后,互斥锁仍然被锁定,但是互斥锁的所有权很容易转移到进程B(这是一个错误).这就是为什么它快乐地哼着,调用WaitForSingleObject(得到WAIT_OBJECT_0)和ReleaseMutex(得到TRUE作为回报).

是否可以使用类似于Mutex的命名同步原语,以便进程A中的崩溃将释放互斥锁?

一种解决方案是使用SEH并捕获崩溃并释放互斥锁,但我真的希望Windows有一个健壮的原语,它不会像进程崩溃那样死锁.

winapi win32-process

9
推荐指数
2
解决办法
5784
查看次数

如何更改流程的优先级?

任何人都可以提供更改进程优先级的代码的Delphi示例吗?

我需要从Windows XP任务管理器获取名称进程,并使用delphi代码更改其优先级.

delphi win32-process

8
推荐指数
1
解决办法
2671
查看次数

如何使Process Explorer的功能"替换任务管理器"?

Process Explorer有一个很好的功能替换任务管理器

在此输入图像描述

我只是想知道Mark Russinovich是如何实现这一点的.
用什么技巧来实现这个?

windows winapi sysinternals win32-process process-explorer

7
推荐指数
1
解决办法
1442
查看次数

在Windows上的Ruby中杀死进程和子进程

目前我在一个命令提示符下执行此操作

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命令不会杀死它们,只是让它们孤立而没有父级.

任何想法如何杀死整个衍生过程及其所有孩子

ruby windows win32-process

7
推荐指数
1
解决办法
5491
查看次数

Visual Studio 2012中的DEF文件语法错误

我有一个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

winapi visual-studio-2010 win32-process visual-studio

7
推荐指数
1
解决办法
5312
查看次数

从wmi获取每个进程的Cpu使用情况

我找到了许多来源来获取每个进程的CPU使用率.一般来说,有很多方法可以获得进程的CPU使用率.

  1. 来自win32_perfformatteddata_perfproc_process的percentprocessortime
  2. system.diagnostics中的performancecounter类
  3. 通过人工计算
  4. 处理类(由process.getcurrentprocess()totalprocessortime;)作为在所述此处.

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)

c# wmi performancecounter win32-process

7
推荐指数
1
解决办法
2万
查看次数

在32位Windows下使用Amd64指令的轻量级方法?

对于某些使用64位变量的CPU绑定代码,使用Amd64指令集而不是x86是有益的.如何在32位Windows(例如Windows XP SP3)下完成?当然,我假设一个现代的,支持Amd64的CPU.我排除了工作但重量级的方法:将完整的64位操作系统作为虚拟机运行,例如在Virtualbox下运行Amd64的Ubuntu.

我知道需要一些程序集,并且会有限制,特别是解决比32位Windows管理更多的内存.但我正在考虑纯粹的计算任务,只需要适量的内存而不需要调用外部函数.

x86-64 cpu-architecture win32-process

6
推荐指数
1
解决办法
644
查看次数

timespec相当于windows

我移植我的应用程序,以windowsunix,我已经碰壁.在我的应用程序中,我需要在几微秒内找到时间(整个应用程序在很大程度上依赖于它,因为它是一个高精度的应用程序).

以前我使用的是timespec结构,但是Windows不包含这样的东西.该命令GetTickCount不够用,因为它以毫秒为单位返回时间.我也在考虑QueryPerformanceFrequency.

有人会碰巧知道尽可能相同的东西timespec吗?

在未来,我甚至可能需要纳秒,我在Windows中搜索的任何内容都不支持.

c c++ windows datetime win32-process

6
推荐指数
1
解决办法
1万
查看次数