如何在记录程序时创建僵尸进程?

时间:2015-12-22 16:19:37

标签: c# wpf events logging zombie-process

这是继续:

Find Window By Caption what is the caption of the window?

为了缩短它我有一个记录器留在托盘中。

然后我有一个启动程序B的程序A.我通过图标跟踪情况:

  • red没有推出B计划
  • 蓝色程序B已启动但无效
  • 绿色程序B正在运行

所以正常的循环颜色是: 红色 - 蓝色 - 绿色 - 红色

如果我在没有记录器的情况下启动A ---> B,则不会出现任何不良情况

记录器保持驻留状态,并使用计时器在发现进程B时通过事件与进程建立连接来扫描进程。

 private void TimerCheck(object sender, EventArgs e)
 {
  Process[] procList = Process.GetProcessesByName("PCDLRN");
  if(procList.GetLength(0) != 0)
  {
    Stream iconStream = Application.GetResourceStream(new Uri("pack://application:,,,/Resources/Images/Blueball.ico")).Stream;
    notifyIcon.Icon = new System.Drawing.Icon(iconStream);
    notifyIcon.Visible = true;


    Thread.Sleep(1000);
    pcdApplication = new PCDLRN.Application();
    pcdApplication.WaitUntilReady(500);
    pcdEvents = pcdApplication.ApplicationEvents;
    pcdEvents.OnStartExecution += PcdEvents_OnStartExecution;
    pcdEvents.OnEndExecution += PcdEvents_OnEndExecution;
    timerCheckPCDmis.Stop();
  }

}

当程序B开始执行时,图标变为绿色

private void PcdEvents_OnStartExecution(PCDLRN.PartProgram PartProg)
{
  Stream iconStream = Application.GetResourceStream(new Uri("pack://application:,,,/Resources/Images/GreenBall.ico")).Stream;
  notifyIcon.Icon = new System.Drawing.Icon(iconStream);
  notifyIcon.Visible = true;
}

相反,当它完成后再次变红

private void PcdEvents_OnEndExecution(PCDLRN.PartProgram PartProg, int TerminationType)
{
  Stream iconStream = Application.GetResourceStream(new Uri("pack://application:,,,/Resources/Images/RedBall.ico")).Stream;
  notifyIcon.Icon = new System.Drawing.Icon(iconStream);
  notifyIcon.Visible = true;

  pcdEvents.OnStartExecution -= PcdEvents_OnStartExecution;
  pcdEvents.OnEndExecution -= PcdEvents_OnEndExecution;

  timerCheckPCDmis.Start();
}

但它会变红而后变蓝。因此,这个过程仍然存在,并且通过我的检查保持活着。这是一个僵尸进程吗?

请注意,如果我执行ctrl + alt + canc并查找进程,则找不到B程序的名称。所以Windows不跟踪僵尸? 那说我随时可以用

杀死它
Process[] procList = Process.GetProcessesByName("PCDLRN");
if (procList.GetLength(0) != 0)
    procList[0].Kill();

但这可能会产生其他问题,所以更好地理解为什么它还活着。

唯一认为我认为保持活着的唯一方法是事件连接,但我确实

pcdEvents.OnStartExecution -= PcdEvents_OnStartExecution;
pcdEvents.OnEndExecution -= PcdEvents_OnEndExecution;

那还有什么让它保持活力?

---编辑emoacht ---

我会试着让它变得更加简单。 我有一个记录器留在托盘中。

比用户可以启动程序。这不是我公司制作的一个程序。我只有一个公开一些成员和事件的库。 我感兴趣的是StartExecution和EndExecution。

  • 所以我的程序保持沉默,并在外部程序进程出现时通过计时器检查。

  • 发生这种情况时,我通过onStartExecution和onEndExecution事件建立连接。

  • 当onEndExecution我与pcdEvents.OnStartExecution - = PcdEvents_OnStartExecution分离事件时;和pcdEvents.OnEndExecution - = PcdEvents_OnEndExecution;

  • 然后计时器重新开始等待外部程序进程。

诀窍是,从那时起,计时器IMMEDIATELY告诉外部进程是活着的。但如果我去TASK MANAGER,我就不会看到它。相反,我可以通过循环进程并杀死它来杀死它。

由于我被低估了,我想我必须更加精确地回答我的问题。所以:

  • 这是"等待进程 - 连接 - 等待结束 - 分离"策略正确

  • 在枚举进程时,任务管理器中看不到但是存在的进程是僵尸

  • 最后如何避免僵尸......

--- --- ADD 我还有其他信息。当我停止并重新启动记录器程序时,前面提到的僵尸会死!所以它真的是我的记录器让僵尸活着

0 个答案:

没有答案