Trao đổi với tôi

http://www.buidao.com

12/22/16

[System Info], Sự khác nhau giữa ExitProcess và TerminateProcess

Sự khác nhau giữa ExitProcess và TerminateProcess

(sưu tầm)

VOID ExitProcess(UINT fuExitCode);
Một process sẽ kết thúc nếu 1 trong những thread của nó gọi ExitProcess. Khi một process kết thúc tất cả các thread con cũng kết thúc theo.
Trong Process bất kỳ luôn có 1 Main thread, tôi đã thấy ở 1 số code, developer kết thúc process bằng cách cho kết thúc Main thread bằng dòng lệnh ExitThread (gọi trong Main thread). Cách này cũng có thể kết thúc process, tuy nhiên trong trường hợp multi-thread, process sẽ phải đợi cho các thread con của nó thoát hết thì nó mới kết thúc.

BOOL TerminateProcess(HANDLE hProcess, UINT fuExitCode);
Hàm này cũng dùng để kết thúc 1 process. Điểm khác chính với ExitProcess ở chỗ: thread bất kỳ có thể gọi TerminateProcess để kết thúc 1 process khác hoặc process của chính nó.

Một điểm lưu ý quan trọng khi dùng TerminateProcess: Bạn chỉ nên dùng TerminateProcess trong trường hợp không còn cách nào khác để làm process đó tự kết thúc (có thể process đó đang "not responding"). Vì lý do: Bình thường thì khi một process kết thúc, Windows sẽ thông báo cho các module DLL đã attach vào process đó một tín hiệu process kết thúc. Tuy nhiên trong trường hợp process kết thúc không theo cách bình thường (bằng TerminateProcess), Windows sẽ không gửi thông báo nào cho các module DLL. Ví dụ: Một DLL đang flush dữ liệu vào đĩa cứng trong khi kết thúc process, Windows gửi tín hiệu unload cho module dll (bằng cách gọi FreeLibrary), và module DLL có thể stop ngay quá trình flush dữ liệu hoặc thông báo process chờ nó flush dữ liệu. Nhưng nếu Windows không thông báo gì cả (khi developer gọi TerminateProcess), data mà module DLL đang flush có thể bị hỏng (Bạn có thể thấy hệ thống Windows không bị vấn đề gì cả nhưng ứng dụng của bạn có thể bị mất dữ liệu do dữ liệu không nhất quán).

Mặc dầu các module DLL có thể không hoàn thành được một số tác vụ, nhưng Windows sẽ bảo đảm toàn bộ vùng nhớ động sẽ được giải phóng, toàn bộ file đang mở vẫn sẽ được đóng, GDI objects sẽ được giải phóng nên hệ thống Windows vẫn trở lại hoạt động bình thường