Ho un programma di console-mode che utilizza SQLite3 per mantenere un file di database. Ci vuole un po 'per essere eseguito, ma dovrebbe essere sicuro in qualsiasi momento di annullarlo, assumendo che le scritture del database avvengano. (Questo è tutto sotto Windows)TerminateProcess vs Ctrl + C
E 'più sicuro, dal punto di un programma in esecuzione, per colpire CtrlC nella console piuttosto che avere un altro TerminateProcess chiamata del programma su di esso?
Ho notato che posso ottenere il danneggiamento del database se viene chiamato TerminateProcess. Presumo che ciò sia dovuto al fatto che il programma non ha la possibilità di terminare le scritture. La mia ipotesi è che CtrlC è meglio, perché il programma ottiene un segnale e termina se stesso, piuttosto che il sistema operativo che lo uccide.
Nota che il programma in realtà non gestisce il segnale (a meno che non lo fa SQLite); Sto parlando dei meccanismi di default built-in di eseguibili Win32 per gestire il CtrlC segnale.
Per chiarire/semplificare la Question- dato che questo articolo ha appena eseguito:
fwrite(buf, 1024*1024, 1, stream);
Durante questo articolo, sarà TerminateProcess comportarsi in modo diverso da CtrlC?
Molto interessante, suppongo che l'operazione di I/O sia completata a prescindere, in quanto semplicemente non ha senso fermarlo, cosa potrebbe fare diversamente da portare alla corruzione. Deve essere un altro modo per bloccare TerminateProcess nascosto da qualche parte. Roba interessante Grazie. – Gavin
Sospetto che TerminateProcess non possa uccidere il processo in modo sicuro mentre sta eseguendo un syscall: il contesto del thread in quel momento si trova nello spazio del kernel e la sua uccisione forzata potrebbe far perdere risorse di sistema. Il sistema operativo probabilmente installa ganci per tutti i thread del processo attualmente in esecuzione nello spazio del kernel che interrompono il thread quando tenta di tornare da syscall. – pmdj