Windows'taki bir uygulamaya ctrl-C (SIGINT) gönderebilir miyim?


91

Ben (geçmişte), komut satırından başlatıldığında, bir kullanıcı yazılan ele çapraz platform (Windows / Unix) uygulamalar yazdım Ctrl- C(yani temiz bir şekilde sonlandırmak için) aynı şekilde kombinasyonunu.

Windows'ta , başka (ilgisiz) bir işlemden bir işleme Ctrl- C/ SIGINT / eşdeğeri göndererek, temiz bir şekilde sonlandırmasını talep etmek (kaynakları düzenleme fırsatı vermek vb.) Mümkün müdür ?


1
Sadece threaddump'ları elde etmek için Ctrl-C'yi java servis süreçlerine göndermekle ilgileniyordum. Bunun jstackyerine bu özel konu için güvenilir bir şekilde kullanılabileceği görülüyor : stackoverflow.com/a/47723393/603516
Vadzim

Yanıtlar:


31

Bir çözüme en yakın olan üçüncü taraf SendSignal uygulaması. Yazar, kaynak kodunu ve bir yürütülebilir dosyayı listeler. 64 bitlik pencerelerde çalıştığını doğruladım (32 bitlik bir program olarak çalışıyor, başka bir 32 bit programı öldürüyor), ancak kodu bir Windows programına (ya 32 bit) nasıl yerleştireceğimi bulamadım veya 64 bit).

Nasıl çalışır:

Hata ayıklayıcıda çok fazla araştırma yaptıktan sonra, ctrl-break gibi bir sinyalle ilişkili davranışı gerçekte yapan giriş noktasının kernel32! CtrlRoutine olduğunu keşfettim. İşlev ThreadProc ile aynı prototipe sahipti, bu nedenle kod enjekte etmek zorunda kalmadan doğrudan CreateRemoteThread ile kullanılabilir. Ancak, bu dışa aktarılmış bir sembol değildir! Windows'un farklı sürümlerinde farklı adreslerde (ve hatta farklı adlara sahip). Ne yapalım?

İşte sonunda bulduğum çözüm. Uygulamam için bir konsol kontrol işleyicisi yükledim ve ardından uygulamam için bir ctrl-break sinyali oluşturuyorum. İşleyicim arandığında, kernel32! BaseThreadStart'a aktarılan parametreleri bulmak için yığının en üstüne bakıyorum. Kernel32! CtrlRoutine'in adresi olan iş parçacığının istenen başlangıç ​​adresi olan ilk parametreyi alıyorum. Ardından, işleyicimden sinyali işlediğimi ve uygulamamın sonlandırılmaması gerektiğini belirterek dönüyorum. Ana iş parçacığına geri döndüğümde, kernel32'nin adresi alınana kadar bekliyorum! CtrlRoutine. Elime geçtikten sonra, keşfedilen başlangıç ​​adresiyle hedef süreçte bir uzak iş parçacığı oluşturuyorum. Bu, hedef işlemdeki ctrl işleyicilerinin ctrl-break basılıymış gibi değerlendirilmesine neden olur!

Güzel olan şey, yalnızca hedef sürecin etkilenmesi ve herhangi bir işlemin (pencereli bir işlem bile) hedeflenebilmesidir. Bir dezavantajı, küçük uygulamamın bir toplu iş dosyasında kullanılamaması, çünkü kernel32'nin adresini keşfetmek için ctrl-break olayını gönderdiğinde onu öldürecek! CtrlRoutine.

( startBir toplu iş dosyasında çalıştırılıyorsa, öncekinden alın .)


2
+1 - Bağlantılı kod Ctrl-C yerine Ctrl-Break kullanır, ancak ön yüzünde (GenerateConsoleCtrlEvent belgelerine bakıldığında) Ctrl-C için uyarlanabilir.
Matthew Murdoch

8
Aslında bunu sizin için yapacak bir fonksiyon var, lol, "GenerateConsoleCtrlEvent". Bakınız: msdn.microsoft.com/en-us/library/ms683155(v=vs.85).aspx Ayrıca
cevabıma

1
Yukarıdaki yanıtla ilgili Github bağlantısı: github.com/walware/statet/tree/master/…
meawoppl

3
Windows'un olduğu kadar eski olduğu ve yine de Microsoft'un konsol uygulaması B'nin konsol uygulaması B'nin konsol uygulaması A'ya temiz bir şekilde kapanmasını söyleyebilmesi için konsol uygulaması B'ye bir sinyal dinlemesi için bir mekanizma sağlamadığı akılda kalmıyor. Her durumda, MS-dayak bir yana, SendSignal'ı denedim ve "CreateRemoteThread 0x00000005 ile başarısız oldu". Bir sinyali (uygun olan herhangi bir sinyali) dinlemek için uygulama A'nın nasıl kodlanacağına ve o zaman bunu nasıl sinyal vereceğine dair başka fikirler var mı?
David I. McIntosh

3
@ DavidI.McIntosh, her iki işlemde de adlandırılmış bir olay oluşturmak istediğiniz gibi görünüyor; o zaman birinden diğerinden sinyal alabilirsiniz. CreateEvent belgelerine bakın
arolson101

58

Beklediğimden daha popüler olduğu ortaya çıkan bu konu hakkında biraz araştırma yaptım. KindDragon'un cevabı en önemli noktalardan biriydi.

Konuyla ilgili daha uzun bir blog yazısı yazdım ve birkaç güzel modda bir komut satırı uygulamasını kapatmak için bu tür bir sistemi kullanmayı gösteren çalışan bir demo programı oluşturdum. Bu gönderi ayrıca araştırmamda kullandığım harici bağlantıları da listeler.

Kısacası, bu demo programları şunları yapar:

  • Net kullanarak görünür bir pencere ile bir program başlatın, pinvoke ile gizleyin, 6 saniye çalıştırın, pinvoke ile gösterin, .Net ile durdurun.
  • .Net kullanarak pencere olmadan bir program başlatın, 6 saniye çalıştırın, konsolu ekleyerek ve ConsoleCtrlEvent'i yayınlayarak durdurun

Düzenleme: Burada ve şimdi kodla ilgilenenler için KindDragon'dan değiştirilmiş çözüm. İlkini durdurduktan sonra başka programları başlatmayı planlıyorsanız, Ctrl-C işlemeyi yeniden etkinleştirmelisiniz, aksi takdirde sonraki işlem ebeveynin devre dışı durumunu devralır ve Ctrl-C'ye yanıt vermez.

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

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

[DllImport("kernel32.dll")]
static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);

delegate bool ConsoleCtrlDelegate(CtrlTypes CtrlType);

// 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);

    //Moved this command up on suggestion from Timothy Jannace (see comments below)
    FreeConsole();

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

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

Ayrıca, AttachConsole()gönderilen sinyalin başarısız olması veya başarısız olması durumunda bir acil durum çözümü için plan yapın , örneğin uykuda sonra bu:

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

4
Bundan esinlenerek, bunu yapan "bağımsız" bir cpp uygulaması yaptım: gist.github.com/rdp/f51fb274d69c5c31b6be , yararlı olması durumunda. Ve evet, bu yöntem görünüşe göre "herhangi" bir pid'e ctrl + c veya ctrl + break gönderebilir.
rogerdpack

DLL dosyalardan biri eksik "SetConsoleCtrlHandler" dosyasını içe aktarır, ancak bu çalışır.
Derf Skren

mükemmel gönderi. mükemmel blog. Deneme programınızda StopProgramWithInvisibleWindowUsingPinvoke işlevini bitirmenizi öneririm. Bir çözüm bulamadığınızı düşünerek neredeyse fikrimi terk ettim
Wilmer Saint

Bunu önlemek için Ctrl-C'yi Yeniden Etkinleştir'iwait() kaldırdım ( ). Birkaç test yaptım (birden çok arama, ayrıca sonlandırılmış süreçlerde) ve herhangi bir yan etki bulamadım (henüz?). SetConsoleCtrlHandler(null, false);
56ka

FreeConsole, GenerateConsoleCtrlEvent gönderildikten hemen sonra çağrılmalıdır. Çağrılıncaya kadar uygulamanız diğer konsola eklenecektir. Diğer konsol kapanmayı bitirmeden öldürülürse, uygulamanız da sonlandırılacaktır!
Timothy Jannace

17

Sanırım bu soruya biraz geç kaldım ama yine de aynı sorunu yaşayanlar için bir şeyler yazacağım. Ben verdiğim gibi bu aynı cevaptır bu soruya.

Benim sorunum, uygulamamın bir GUI uygulaması olmasını istemem, ancak yürütülen işlemlerin herhangi bir etkileşimli konsol penceresi eklenmeden arka planda çalıştırılması gerektiğiydi. Bence bu çözüm, üst süreç bir konsol süreci olduğunda da işe yaramalı. Yine de "CREATE_NO_WINDOW" bayrağını kaldırmanız gerekebilir.

Bunu bir sarmalayıcı uygulamasıyla GenerateConsoleCtrlEvent () kullanarak çözmeyi başardım . İşin zor yanı, dokümantasyonun tam olarak nasıl kullanılabileceği ve onunla ilgili tuzaklar konusunda gerçekten net olmamasıdır.

Benim çözümüm burada anlatılanlara dayanmaktadır . Ancak bu, tüm ayrıntıları ve bir hatayla gerçekten açıklamadı, bu yüzden işte nasıl çalıştırılacağına dair ayrıntılar.

Yeni bir yardımcı uygulama "Helper.exe" oluşturun. Bu uygulama, uygulamanız (ebeveyn) ile kapatmak istediğiniz alt süreç arasında yer alacaktır. Aynı zamanda gerçek çocuk sürecini de yaratacaktır. Bu "aracı" işlemine sahip olmalısınız, yoksa GenerateConsoleCtrlEvent () başarısız olur.

Yardımcının alt süreci kapatması gerektiğini ebeveynden yardımcı sürece iletmek için bir tür IPC mekanizması kullanın. Yardımcı bu olayı aldığında, kendisini ve alt süreci kapatan "GenerateConsoleCtrlEvent (CTRL_BREAK, 0)" öğesini çağırır. Bunun için kendim için ebeveynin alt süreci iptal etmek istediğinde tamamladığı bir olay nesnesi kullandım.

Helper.exe dosyanızı oluşturmak için CREATE_NO_WINDOW ve CREATE_NEW_PROCESS_GROUP ile oluşturun. Ve alt süreci oluştururken, konsolu üstünden türeteceği anlamına gelen bayraksız (0) oluşturun. Bunu yapmamak, olayı görmezden gelmesine neden olacaktır.

Her adımın böyle yapılması çok önemli. Tüm farklı kombinasyonları deniyorum ama bu kombinasyon işe yarayan tek kombinasyon. CTRL_C olayı gönderemezsiniz. Başarıya geri dönecek, ancak süreç tarafından göz ardı edilecektir. CTRL_BREAK, çalışan tek kişidir. Sonunda ikisi de ExitProcess () çağıracağı için gerçekten önemli değil.

Ayrıca, GenerateConsoleCtrlEvent () öğesini, yardımcı sürecin yaşamaya devam etmesine doğrudan izin veren alt süreç kimliğinin bir işlem groupd kimliğiyle çağıramazsınız. Bu da başarısız olacaktır.

Bunu çalıştırmaya çalışmak için bütün bir gün geçirdim. Bu çözüm benim için çalışıyor, ancak herhangi birinin ekleyeceği bir şey varsa lütfen yapın. Ağın her yerine benzer sorunları olan birçok insan buldum, ancak soruna kesin bir çözüm bulamadım. GenerateConsoleCtrlEvent () nasıl çalışır da biraz tuhaftır, bu yüzden herhangi biri hakkında daha fazla ayrıntı biliyorsa lütfen paylaşın.


6
Çözüm için teşekkürler! Bu, Windows API'nin bu kadar korkunç bir karmaşa olmasının bir başka örneğidir.
vitaut

8

Düzenle:

Bir GUI Uygulaması için, Windows geliştirmede bunu halletmenin "normal" yolu, sürecin ana penceresine bir WM_CLOSE mesajı göndermektir.

Bir konsol uygulama için, kullanmaya gerek SetConsoleCtrlHandler bir ekleme CTRL_C_EVENT.

Uygulama buna uymuyorsa, TerminateProcess'i çağırabilirsiniz .


Bunu bir komut satırı uygulamasında (pencere yok) yapmak istiyorum. TerminateProcess bir kuvvet öldürme mekanizmasıdır (SIGKILL'e benzer), bu nedenle sonlandıran uygulamaya temizleme fırsatı vermez.
Matthew Murdoch

@Matthew Murdoch: Bunun bir konsol uygulamasında nasıl ele alınacağına ilişkin bilgileri içerecek şekilde güncellendi. Aynı mekanizma aracılığıyla pencerelerin kapatılması veya konsolun kapatılması gibi diğer olayları da yakalayabilirsiniz. Tüm ayrıntılar için MSDN'ye bakın.
Reed Copsey

@Reed Copsey: Ama bunu ayrı bir süreçten başlatmak istiyorum. GenerateConsoleCtrlEvent'e (SetConsoleCtrlHandler'dan atıfta bulunulmuştur) bir göz attım, ancak bu yalnızca sonlandırılan işlem, sonlandırmayı yapan işlemle aynı 'işlem grubunda' ise işe yarıyor gibi görünüyor ...
Matthew Murdoch

1
Matthew: Sahip olduğum tek fikir, süreci bulmak, üstünü (konsol) bulmak, ebeveynin ana pencere tutamacını (konsol) almak ve doğrudan ona Ctrl + C göndermek için SendKeys kullanmak olurdu. Bu, konsol işleminizin bir CTRL_C_EVENT almasına neden olmalıdır. Yine de denemedim - ne kadar iyi çalışacağından emin değilim.
Reed Copsey

SendKeys için bir c ++ eşdeğeri stackoverflow.com/questions/6838363/… ayrıca bkz. Stackoverflow.com/questions/10407769/… ama görünüşe göre o zaman bile çalışması garanti
edilmiyor

7

GenerateConsoleCtrlEvent()Başka bir işlem için çağırırsanız bir şekilde hata verir, ancak başka bir konsol uygulamasına ekleyebilir ve tüm alt süreçlere olay gönderebilirsiniz.

void SendControlC(int pid)
{
    AttachConsole(pid); // attach to process console
    SetConsoleCtrlHandler(NULL, TRUE); // disable Control+C handling for our app
    GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); // generate Control+C event
}

ve kontrol nasıl iade edilir? ve sonra kontrol-c, stopar programı gönderiyorum ama elleriyle hiçbir şey yapamıyorum.
Yaroslav L.

Kontrol nereye iade edilir?
KindDragon

İşleyicinizi kaldırmak için SetConsoleCtrlHandler'ı (NULL, FALSE) çağırdığınızı düşünüyorum, diğer çeşitli yanıtlara bakın.
rogerdpack

6

İşte C ++ uygulamamda kullandığım kod.

Olumlu noktalar:

  • Konsol uygulamasından çalışır
  • Windows hizmetinden çalışır
  • Gecikme gerekmez
  • Mevcut uygulamayı kapatmaz

Olumsuz noktalar:

  • Ana konsol kaybolur ve yeni bir konsol oluşturulur (bkz. FreeConsole )
  • Konsol değişimi garip sonuçlar veriyor ...

// Inspired from http://stackoverflow.com/a/15281070/1529139
// and http://stackoverflow.com/q/40059902/1529139
bool signalCtrl(DWORD dwProcessId, DWORD dwCtrlEvent)
{
    bool success = false;
    DWORD thisConsoleId = GetCurrentProcessId();
    // Leave current console if it exists
    // (otherwise AttachConsole will return ERROR_ACCESS_DENIED)
    bool consoleDetached = (FreeConsole() != FALSE);

    if (AttachConsole(dwProcessId) != FALSE)
    {
        // Add a fake Ctrl-C handler for avoid instant kill is this console
        // WARNING: do not revert it or current program will be also killed
        SetConsoleCtrlHandler(nullptr, true);
        success = (GenerateConsoleCtrlEvent(dwCtrlEvent, 0) != FALSE);
        FreeConsole();
    }

    if (consoleDetached)
    {
        // Create a new console if previous was deleted by OS
        if (AttachConsole(thisConsoleId) == FALSE)
        {
            int errorCode = GetLastError();
            if (errorCode == 31) // 31=ERROR_GEN_FAILURE
            {
                AllocConsole();
            }
        }
    }
    return success;
}

Kullanım örneği:

DWORD dwProcessId = ...;
if (signalCtrl(dwProcessId, CTRL_C_EVENT))
{
    cout << "Signal sent" << endl;
}

4
        void SendSIGINT( HANDLE hProcess )
        {
            DWORD pid = GetProcessId(hProcess);
            FreeConsole();
            if (AttachConsole(pid))
            {
                // Disable Ctrl-C handling for our program
                SetConsoleCtrlHandler(NULL, true);

                GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); // SIGINT

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

                WaitForSingleObject(hProcess, 10000);
            }
        }

2

Kristal netliğe kavuşturulmalı çünkü şu anda öyle değil. Ctrl-C göndermek için SendSignal'ın değiştirilmiş ve derlenmiş bir sürümü vardır (varsayılan olarak yalnızca Ctrl + Break gönderir). İşte bazı ikili dosyalar:

(2014-3-7): Ctrl-C ile hem 32 bit hem de 64 bit sürüm oluşturdum, adı SendSignalCtrlC.exe ve şu adresten indirebilirsiniz: https://dl.dropboxusercontent.com/u/49065779/ sendsignalctrlc / x86 / SendSignalCtrlC.exe https://dl.dropboxusercontent.com/u/49065779/sendsignalctrlc/x86_64/SendSignalCtrlC.exe - Juraj Michalak

Ayrıca bu dosyaları tam olarak yansıttım:
32 bit sürüm: https://www.dropbox.com/s/r96jxglhkm4sjz2/SendSignalCtrlC.exe?dl=0
64-bit sürüm: https://www.dropbox.com /s/hhe0io7mcgcle1c/SendSignalCtrlC64.exe?dl=0

Sorumluluk reddi: Bu dosyaları ben oluşturmadım. Derlenen orijinal dosyalarda herhangi bir değişiklik yapılmadı. Test edilen tek platform 64 bit Windows 7'dir. Http://www.latenighthacking.com/projects/2003/sendSignal/ adresinde bulunan kaynağı uyarlamanız ve kendiniz derlemeniz önerilir .


2

Java'da, C ++ çözümüne benzer şekilde Kernel32.dll kitaplığıyla JNA kullanarak. CtrlCSender ana yöntemini, yalnızca Ctrl + C olayını göndermek için işlemin konsolunu alan ve olayı oluşturan bir İşlem olarak çalıştırır. Konsol olmadan ayrı olarak çalıştığı için Ctrl + C olayının devre dışı bırakılması ve yeniden etkinleştirilmesi gerekmez.

CtrlCSender.java - Nemo1024 ve KindDragon'un cevaplarına göre.

Bilinen bir işlem kimliği verildiğinde, bu konsolsuz uygulama, hedeflenen işlemin konsolunu ekleyecek ve üzerinde bir CTRL + C Olayı oluşturacaktır.

import com.sun.jna.platform.win32.Kernel32;    

public class CtrlCSender {

    public static void main(String args[]) {
        int processId = Integer.parseInt(args[0]);
        Kernel32.INSTANCE.AttachConsole(processId);
        Kernel32.INSTANCE.GenerateConsoleCtrlEvent(Kernel32.CTRL_C_EVENT, 0);
    }
}

Ana Uygulama - CtrlCSender'ı ayrı bir konsolsuz işlem olarak çalıştırır

ProcessBuilder pb = new ProcessBuilder();
pb.command("javaw", "-cp", System.getProperty("java.class.path", "."), CtrlCSender.class.getName(), processId);
pb.redirectErrorStream();
pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
pb.redirectError(ProcessBuilder.Redirect.INHERIT);
Process ctrlCProcess = pb.start();
ctrlCProcess.waitFor();

hmm, bunu bir powershell işlemine karşı çalıştırırsam süreç canlı kalır. Öte yandan, ilginç bir şekilde, JVM üzerinde işlem içi çalıştırma gerçekten de sanal makineyi durdurur! Bir powershell sürecinin neden bu tekniğe yanıt vermeyeceğine dair bir fikriniz var mı?
Groostav


1

Komut satırınızda python 3.x varsa , buradan bulduğum bir çözüm oldukça basittir. Önce, içeriğiyle bir dosya (ctrl_c.py) kaydedin:

import ctypes
import sys

kernel = ctypes.windll.kernel32

pid = int(sys.argv[1])
kernel.FreeConsole()
kernel.AttachConsole(pid)
kernel.SetConsoleCtrlHandler(None, 1)
kernel.GenerateConsoleCtrlEvent(0, 0)
sys.exit(0)

Sonra ara:

python ctrl_c.py 12345

Bu işe yaramazsa, windows-kill projesini denemenizi tavsiye ederim: https://github.com/alirdn/windows-kill


0

Bir arkadaşım sorunu çözmek için tamamen farklı bir yol önerdi ve bu benim için çalıştı. Aşağıdaki gibi bir vbscript kullanın. Başlar ve uygulama, 7 saniye çalışmasına izin verin ve ctrl + c ile kapatın .

'VBScript Örneği

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run "notepad.exe"

WshShell.AppActivate "notepad"

WScript.Sleep 7000

WshShell.SendKeys "^C"

Bu, uygulamanın AppActive yapabileceğiniz bir penceresi varsa çalışır (ön plana getirin).
rogerdpack

0

Tüm bunları çok karmaşık buldum ve geçici çözüm olarak komut satırı penceresine (yani cmd.exe penceresi) bir - tuş vuruşu göndermek için SendKeys'i kullandım .CTRLC


0
// Send [CTRL-C] to interrupt a batch file running in a Command Prompt window, even if the Command Prompt window is not visible,
// without bringing the Command Prompt window into focus.
// [CTRL-C] will have an effect on the batch file, but not on the Command Prompt  window itself -- in other words,
// [CTRL-C] will not have the same visible effect on a Command Prompt window that isn't running a batch file at the moment
// as bringing a Command Prompt window that isn't running a batch file into focus and pressing [CTRL-C] on the keyboard.
ulong ulProcessId = 0UL;
// hwC = Find Command Prompt window HWND
GetWindowThreadProcessId (hwC, (LPDWORD) &ulProcessId);
AttachConsole ((DWORD) ulProcessId);
SetConsoleCtrlHandler (NULL, TRUE);
GenerateConsoleCtrlEvent (CTRL_C_EVENT, 0UL);
SetConsoleCtrlHandler (NULL, FALSE);
FreeConsole ();


-1

İşlem kimliğine bağlı olarak, zorla veya nazikçe veya başka herhangi bir sinyali sonlandırmak için işleme sinyali gönderebiliriz.

Tüm süreci listeleyin:

C:\>tasklist

Süreci sonlandırmak için:

C:\>Taskkill /IM firefox.exe /F
or
C:\>Taskkill /PID 26356 /F

Detaylar:

http://tweaks.com/windows/39559/kill-processes-from-command-prompt/


Muhtemelen bu sigterm gönderiyor mu?
teknopaul

Taskkill CTRL-C göndermez. Windows sinyallerini kontrol edin.
Josi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.