Mengakhiri Proses
Mengakhiri proses memiliki hasil berikut:
- Setiap utas yang tersisa dalam proses ditandai untuk penghentian.
- Sumber daya apa pun yang dialokasikan oleh proses dikosongkan.
- Semua objek kernel ditutup.
- Kode proses dihapus dari memori.
- Kode keluar proses diatur.
- Objek proses disinyalir.
Saat handel terbuka ke objek kernel ditutup secara otomatis ketika proses berakhir, objek itu sendiri ada sampai semua handel terbuka ditutup. Oleh karena itu, objek akan tetap valid setelah proses yang menggunakannya berakhir jika proses lain memiliki handel terbuka untuk itu.
Fungsi GetExitCodeProcess mengembalikan status penghentian proses. Saat proses dijalankan, status penghentiannya STILL_ACTIVE. Ketika proses berakhir, status penghentiannya berubah dari STILL_ACTIVE ke kode keluar proses.
Ketika proses berakhir, status objek proses menjadi sinyal, melepaskan utas apa pun yang telah menunggu proses dihentikan. Untuk informasi selengkapnya tentang sinkronisasi, lihat Menyinkronkan Eksekusi Beberapa Utas.
Ketika sistem mengakhiri proses, sistem tidak mengakhiri proses turunan apa pun yang telah dibuat prosesnya. Mengakhiri proses tidak menghasilkan pemberitahuan untuk prosedur kait WH_CBT.
Gunakan fungsi SetProcessShutdownParameters untuk menentukan aspek tertentu dari penghentian proses pada pematian sistem, seperti kapan proses harus berakhir relatif terhadap proses lain dalam sistem.
Bagaimana Proses Dihentikan
Proses dijalankan hingga salah satu peristiwa berikut terjadi:
- Setiap utas proses memanggil fungsi ExitProcess . Perhatikan bahwa beberapa implementasi pustaka run-time C (CRT) memanggil ExitProcess jika utas utama proses kembali.
- Utas terakhir proses berakhir.
- Setiap utas memanggil fungsi TerminateProcess dengan handel ke proses.
- Untuk proses konsol, handler kontrol konsol default memanggil ExitProcess saat konsol menerima sinyal CTRL+C atau CTRL+BREAK.
- Pengguna mematikan sistem atau log keluar.
Jangan mengakhiri proses kecuali utasnya berada dalam status yang diketahui. Jika utas menunggu pada objek kernel, utas tidak akan dihentikan sampai penantian selesai. Hal ini dapat menyebabkan aplikasi berhenti merespons.
Utas utama dapat menghindari penghentian utas lain dengan mengarahkannya untuk memanggil ExitThread sebelum menyebabkan proses dihentikan (untuk informasi selengkapnya, lihat Mengakhiri Utas). Utas utama masih dapat memanggil ExitProcess setelahnya untuk memastikan bahwa semua utas dihentikan.
Kode keluar untuk proses adalah nilai yang ditentukan dalam panggilan ke ExitProcess atau TerminateProcess, atau nilai yang dikembalikan oleh fungsi utama atau WinMain dari proses. Jika proses dihentikan karena pengecualian fatal, kode keluar adalah nilai pengecualian yang menyebabkan penghentian. Selain itu, nilai ini digunakan sebagai kode keluar untuk semua utas yang dijalankan saat pengecualian terjadi.
Jika proses dihentikan oleh ExitProcess, sistem memanggil fungsi titik masuk dari setiap DLL terlampir dengan nilai yang menunjukkan bahwa proses dicopot dari DLL. DLL tidak diberi tahu ketika proses dihentikan oleh TerminateProcess. Untuk informasi selengkapnya tentang DLL, lihat Pustaka Dynamic-Link.
Jika proses dihentikan oleh TerminateProcess, semua utas proses segera dihentikan tanpa kesempatan untuk menjalankan kode tambahan. Ini berarti bahwa utas tidak menjalankan kode dalam blok handler penghentian. Selain itu, tidak ada DLL terlampir yang diberi tahu bahwa prosesnya dicopot. Jika Anda harus memiliki satu proses mengakhiri proses lain, langkah-langkah berikut memberikan solusi yang lebih baik:
Minta kedua proses memanggil fungsi RegisterWindowMessage untuk membuat pesan privat.
Satu proses dapat mengakhiri proses lainnya dengan menyiarkan pesan privat menggunakan fungsi BroadcastSystemMessage sebagai berikut:
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
Proses menerima pesan privat memanggil ExitProcess untuk mengakhiri eksekusinya.
Eksekusi fungsi ExitProcess, ExitThread, CreateThread, CreateRemoteThread, dan CreateProcess diserialisasikan dalam ruang alamat. Pembatasan berikut berlaku:
- Selama rutinitas startup proses dan inisialisasi DLL, utas baru dapat dibuat, tetapi tidak memulai eksekusi sampai inisialisasi DLL selesai untuk proses tersebut.
- Hanya satu utas pada satu waktu yang dapat berada dalam inisialisasi DLL atau melepaskan rutinitas.
- Fungsi ExitProcess tidak kembali sampai tidak ada utas dalam inisialisasi DLL atau mencopot rutinitasnya.