SORU
1 Mayıs 2009, Cuma


Windows, bir uygulama için ctrl-C (SIGINT) gönderebilir miyim?

(Geçmişte), komut satırından başlatıldığında, bir kullanıcı tarafından yazılan bir işlenmiş olan çapraz platform (Windows/Unix) uygulamaları yazdımCtrl-Caynı şekilde, uygulamayı sonlandırmak için yani temiz) kombinasyonu.

Olası Windows üzerinde bir göndermektirCtrl-C//Başka bir işlem () ilgisiz denk temiz bir şekilde (derli toplu için fırsat kaynakları vb. bir vererek) sonlandırmak talep süreci SIGINT?

CEVAP
7 Mart 2013, PERŞEMBE


Tahmin ettiğimden daha popüler olduğu ortaya çıktı bu konuda, etrafta biraz araştırma yaptım. KindDragon cevabı önemli noktalarından biri oldu.

Konu longer blog post yazdım ve bu tür bir sistem oldukça şıklar birkaç komut satırı uygulaması kapatmak için kullanarak gösteren çalışma demo bir program oluşturuldu. Bu yazı da benim araştırmada kullanılan dış bağlantıları listeler.

Kısacası, bu demo programlar aşağıdakileri yapın:

  • Görünür bir pencere kullanarak bir programı başlatın .Pınvoke ile gizle Net, 6 saniye çalıştırın, pınvoke ile, kes göster .Net.
  • Bir pencere olmadan bir programı başlatın .Net, 6 saniye çalıştırın, takma konsolu ve ConsoleCtrlEvent yayımlayarak dur

Düzenleme:Kod ilgilenenler için KindDragon gelen değişik çözüm burada ve şimdi. Eğer planı için başlangıç diğer programları sonra durdurma ilki, yeniden etkinleştirmek için Ctrl-C kullanma, aksi takdirde önümüzdeki süreç devralacak ebeveynin engelli devlet olmaz cevap için Ctrl-C

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AttachConsole(uint dwProcessId);

[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool FreeConsole();

// Enumerated type for the control messages sent to the handler routine
enum CtrlTypes : uint
{
  CTRL_C_EVENT = 0,
  CTRL_BREAK_EVENT,
  CTRL_CLOSE_EVENT,
  CTRL_LOGOFF_EVENT = 5,
  CTRL_SHUTDOWN_EVENT
}

[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GenerateConsoleCtrlEvent(CtrlTypes dwCtrlEvent, uint dwProcessGroupId);

public void StopProgram(Process proc)
{
  //This does not require the console window to be visible.
  if (AttachConsole((uint)proc.Id))
  {
    // Disable Ctrl-C handling for our program
    SetConsoleCtrlHandler(null, true); 
    GenerateConsoleCtrlEvent(CtrlTypes.CTRL_C_EVENT, 0);

    // Must wait here. If we don't and re-enable Ctrl-C
    // handling below too fast, we might terminate ourselves.
    proc.WaitForExit(2000);

    FreeConsole();

    //Re-enable Ctrl-C handling or any subsequently started
    //programs will inherit the disabled state.
    SetConsoleCtrlHandler(null, false); 
  }
}

Ayrıca, eğer AttachConsole() veya gönderilen sinyal, örneğin bu uyku başarısız olursa alternatif bir çözüm planı:

if (!proc.HasExited)
{
  try
  {
    proc.Kill();
  }
  catch (InvalidOperationException e){}
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ELawshea

    ELawshea

    26 Mayıs 2008
  • Mark Halberstadt

    Mark Halbers

    19 ŞUBAT 2010
  • MrMimoB

    MrMimoB

    11 NİSAN 2011