Mengakhiri Proses
Mengakhiri proses memiliki hasil berikut:
- Thread yang tersisa dalam proses ditandai untuk diakhiri.
- Sumber daya apa pun yang dialokasikan oleh proses dibebaskan.
- Semua objek kernel ditutup.
- Kode proses dihapus dari memori.
- Kode keluar proses telah ditetapkan.
- Objek proses diberi sinyal.
Saat handle yang terbuka ke objek kernel ditutup secara otomatis ketika proses berakhir, objek itu masih ada sampai semua handle terbuka ditutup. Oleh karena itu, objek akan tetap valid setelah proses yang menggunakannya berakhir jika proses lain memiliki handel terbuka untuk itu.
FungsiGetExitCodeProcessmengembalikan 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 disinyalkan, melepaskan utas-utas yang menunggu proses berhenti. Untuk informasi selengkapnya tentang sinkronisasi, silakan lihat Penyelarasan Eksekusi Multi-Utas.
Ketika sistem mengakhiri proses, sistem tidak mengakhiri proses turunan apa pun yang telah dibuat oleh proses tersebut. Mengakhiri proses tidak menghasilkan pemberitahuan pada prosedur kait WH_CBT.
Gunakan fungsi SetProcessShutdownParameters untuk menentukan aspek-aspek tertentu dari penghentian proses saat sistem dimatikan, seperti kapan proses harus berakhir relatif terhadap proses lain dalam sistem.
Proses dijalankan hingga salah satu peristiwa berikut terjadi:
- Setiap utas proses memanggil fungsi ExitProcess. Perhatikan bahwa beberapa implementasi pustaka run-time C (CRT) akan memanggil ExitProcess jika utas utama dari proses selesai atau kembali.
- Utas terakhir proses berakhir.
- Setiap utas memanggil fungsi TerminateProcess dengan handle 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 sebuah utas sedang menunggu pada objek kernel, utas tersebut 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 Thread). Utas utama masih dapat memanggil ExitProcess setelahnya untuk memastikan bahwa semua utas dihentikan.
Kode keluar untuk sebuah proses adalah nilai yang ditentukan dalam pemanggilan 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 sedang dijalankan ketika pengecualian terjadi.
Jika proses dihentikan oleh ExitProcess, sistem memanggil fungsi titik masuk dari setiap DLL yang terpasang dengan nilai yang menunjukkan bahwa proses tersebut sedang memutuskan hubungan 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 alur proses segera dihentikan tanpa kesempatan untuk menjalankan kode tambahan. Ini berarti bahwa proses thread tidak menjalankan kode dalam blok penangan penghentian. Selain itu, tidak ada DLL terlampir yang diberitahukan bahwa prosesnya sedang dilepaskan. Jika Anda harus memiliki satu proses mengakhiri proses lain, langkah-langkah berikut memberikan solusi yang lebih baik:
Minta kedua proses memanggil fungsiRegisterWindowMessage untuk membuat pesan privat.
Satu proses dapat mengakhiri proses lain 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 penerimaan pesan pribadi memanggil ExitProcess untuk menghentikan eksekusinya.
Eksekusi 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 mereka tidak memulai eksekusi sampai inisialisasi DLL selesai untuk proses tersebut.
- Hanya satu utas pada satu waktu yang dapat berada dalam rutinitas inisialisasi atau pelepasan DLL.
- Fungsi ExitProcess tidak berhenti sampai tidak ada utas yang sedang menjalankan inisialisasi atau rutinitas pelepasan DLL mereka.