Tôi có một chương trình chế độ bàn điều khiển sử dụng SQLite3 để duy trì tệp cơ sở dữ liệu. Phải mất một lúc để thực thi, nhưng nó sẽ an toàn tại bất kỳ thời điểm nào để hủy bỏ, giả sử rằng cơ sở dữ liệu ghi xảy ra. (Đây là tất cả các hệ điều hành Windows)TerminateProcess vs Ctrl + C
Có bất kỳ an toàn hơn, từ quan điểm của một chương trình đang chạy, để đạt CtrlC trong giao diện điều khiển hơn để có một TerminateProcess gọi chương trình trên đó?
Tôi đã nhận thấy rằng tôi có thể bị hỏng cơ sở dữ liệu nếu TerminateProcess được gọi- tôi giả định rằng điều này là do chương trình không có cơ hội hoàn tất quá trình ghi. Tôi đoán là CtrlC là tốt hơn, bởi vì chương trình nhận được tín hiệu và chấm dứt chính nó, thay vì hệ điều hành giết nó.
Lưu ý rằng chương trình không thực sự xử lý tín hiệu (trừ khi SQLite thực hiện); Tôi đang nói về các cơ chế mặc định tích hợp của các tệp thực thi Win32 để xử lý tín hiệu CtrlC.
Để làm rõ/đơn giản hóa gian hỏi cho rằng viết này vừa thực hiện:
fwrite(buf, 1024*1024, 1, stream);
Trong ghi này, TerminateProcess sẽ hành xử khác nhau từ CtrlC?
Rất intresting, tôi cho rằng các hoạt động IO hoàn thành bất kể, vì nó chỉ đơn giản là không có ý nghĩa để ngăn chặn nó, những gì nó có thể nó có thể làm khác hơn là dẫn đến tham nhũng. Phải là một cách khác để chặn TerminateProcess ẩn trong đó ở đâu đó. Công cụ thú vị. cảm ơn. – Gavin
Tôi nghi ngờ TerminateProcess không thể giết an toàn quá trình trong khi nó thực hiện một syscall: bối cảnh thread ở giai đoạn đó là trong không gian hạt nhân, và buộc phải giết nó có thể bị rò rỉ tài nguyên hệ thống. Hệ điều hành có thể cài đặt các móc cho tất cả các luồng của quá trình hiện đang thực hiện trong không gian hạt nhân mà sẽ hủy bỏ chuỗi khi nó cố gắng trả về từ syscall. – pmdj