Aracılığıyla paylaş


İşlemi Sonlandırma

Bir işlemi sonlandırmak aşağıdaki sonuçları içerir:

  • İşlemdeki kalan tüm iş parçacıkları sonlandırma için işaretlenir.
  • İşlem tarafından ayrılan tüm kaynaklar serbest bırakıldı.
  • Tüm çekirdek nesneleri kapatılır.
  • İşlem kodu bellekten kaldırılır.
  • İşlem çıkış kodu ayarlanır.
  • İşlem nesnesine işaret edilir.

Bir işlem sonlandırıldığında çekirdek nesnelerine yönelik açık tanıtıcılar otomatik olarak kapatılır; ancak, nesnelerin kendileri, onlara ait tüm açık tanıtıcılar kapatılana kadar var olmaya devam eder. Bu nedenle, bir nesneyi kullanan bir işlem sonlandırıldıktan sonra, başka bir işlem bu nesneye açık bir tanıtıcıya sahipse, nesne geçerli kalır.

GetExitCodeProcess işlevi bir işlemin sonlandırma durumunu döndürür. Bir işlem yürütülürken sonlandırma durumu HÂLÂ_AKTİF. bir işlem sonlandırıldığında, sonlandırma durumu STILL_ACTIVE'den işlemin çıkış koduna dönüşür.

Bir işlem sonlandırıldığında, işlem nesnesinin durumu işaretlenir ve işlemin sonlandırılması için bekleyen tüm iş parçacıkları serbest bırakılır. Senkronizasyon hakkında daha fazla bilgi için bkz. Birden Çok İş Parçacığının Yürütülmesinin Senkronizasyonu.

Sistem bir işlemi sonlandırdığında, işlemin oluşturduğu alt işlemleri sonlandırmaz. Bir işlemi sonlandırmak, WH_CBT kanca yordamlarına bildirim oluşturmaz.

Bir işlemin sistemdeki diğer işlemlere göre sonlandırılması gerektiği durumlar gibi, sistem kapatma sırasında işlem sonlandırmanın belirli yönlerini belirtmek için SetProcessShutdownParametersişlevinikullanın.

İşlemler Nasıl Sonlandırılır?

Aşağıdaki olaylardan biri gerçekleşene kadar bir işlem yürütülür:

  • İşlemin herhangi bir iş parçacığı ExitProcess işlevini çağırır. C çalışma zamanı kitaplığının (CRT) bazı uygulamalarının, işlemin birincil iş parçacığı geri dönerse ExitProcess çağırdığını unutmayın.
  • İşlemin son iş parçacığı tamamlanır.
  • Herhangi bir iş parçacığı, TerminateProcess işlevini işlemin tanıtıcısını kullanarak çağırır.
  • Konsol işlemleri için, konsol CTRL+C veya CTRL+BREAK sinyali aldığında varsayılan konsol denetim işleyicisi ExitProcessçağırır.
  • Kullanıcı sistemi kapatır veya oturumu kapatır.

İş parçacıkları bilinen durumlarda olmadığı sürece bir işlemi sonlandırmayın. Bir iş parçacığı bir çekirdek nesnesi üzerinde bekliyorsa, bekleme tamamlanana kadar sonlandırılmaz. Bu, uygulamanın yanıt vermeyi durdurmasına neden olabilir.

Birincil iş parçacığı, işlemin sonlandırılmasına neden olmadan önce diğer iş parçacıklarını ExitThread çağırmaya yönlendirerek sonlandırmaktan kaçınabilir (daha fazla bilgi için bkz. İş Parçacığını Sonlandırma). Birincil iş parçacığı, daha sonra tüm iş parçacıklarının sonlandırıldığından emin olmak için ExitProcess çağrısını yapabilir.

bir işlemin çıkış kodu, ExitProcessveya TerminateProcessçağrısında belirtilen değer ya da işlemin ana veya WinMain işlevi tarafından döndürülen değerdir. Önemli bir özel durum nedeniyle bir işlem sonlandırılırsa, çıkış kodu sonlandırmaya neden olan özel durumun değeridir. Ayrıca bu değer, özel durum oluştuğunda yürütülen tüm iş parçacıkları için çıkış kodu olarak kullanılır.

Eğer bir işlem ExitProcessile sonlandırılırsa, sistem, ekli her DLL'nin giriş noktası işlevini, işlemin DLL'den ayrıldığını belirten bir değerle çağırır. bir işlem TerminateProcesstarafından sonlandırıldığında DLL'lere bildirimde bulunulamaz. DLL'ler hakkında daha fazla bilgi için bkz. Dynamic-Link Kitaplıkları.

bir işlem TerminateProcesstarafından sonlandırılırsa, işlemin tüm iş parçacıkları ek kod çalıştırma şansı olmadan hemen sonlandırılır. Bu, iş parçacığının sonlandırma işleyici bloklarında kod yürütmediği anlamına gelir. Ayrıca, ekli DLL'lere işlemin sona erdirildiği bildirilmiyor. Bir işlemin başka bir işlemi sonlandırması gerekiyorsa, aşağıdaki adımlar daha iyi bir çözüm sağlar:

  • Her iki işlemin de özel ileti oluşturmak için RegisterWindowMessage işlevini çağırmasını sağlayın.

  • Bir işlem, BroadcastSystemMessage işlevini kullanarak aşağıdaki gibi özel bir ileti yayınlayarak diğer işlemi sonlandırabilir:

     DWORD dwRecipients = BSM_APPLICATIONS;
        UINT uMessage = PM_MYMSG;
        WPARAM wParam = 0;
        LPARAM lParam = 0;
    
        BroadcastSystemMessage( 
            BSF_IGNORECURRENTTASK, // do not send message to this process
            &dwRecipients,         // broadcast only to applications
            uMessage,              // registered private message
            wParam,                // message-specific value
            lParam );              // message-specific value
    
  • Özel iletiyi alan işlem, yürütülmesini sonlandırmak için ExitProcessçağırır.

ExitProcess, ExitThread, CreateThread, CreateRemoteThreadve CreateProcess işlevlerinin yürütülmesi bir adres alanı içinde serileştirilir. Aşağıdaki kısıtlamalar geçerlidir:

  • İşlem başlatma ve DLL başlatma yordamları sırasında yeni iş parçacıkları oluşturulabilir, ancak işlem için DLL başlatma işlemi tamamlanana kadar yürütmeye başlamaz.
  • DLL başlatma veya ayırma yordamında aynı anda yalnızca bir iş parçacığı olabilir.
  • ExitProcess işlevi, hiçbir iş parçacığı DLL başlatma veya ayırma yordamlarında kalmadıkça geri dönmez.