E 'possibile scrivere un programma in C che dopo l'esecuzione si cancella da solo (il binario) e quindi termina con successo. In tal caso, qual è il modo più semplice per farlo?È possibile scrivere un programma autodistruttivo in C?
risposta
Sì.
#include <unistd.h>
int main(int argc, char* argv[])
{
return unlink(argv[0]);
}
(testato e funziona.)
Nota che se argv[0]
non indica il binario (riscritto da chiamante) questo non funzionerà. Analogamente se si esegue un collegamento simbolico, il collegamento simbolico, non il file binario, verrà eliminato.
Anche se il file ha più collegamenti fisici, verrà rimosso solo il collegamento chiamato.
Funziona alla grande - grazie! –
Ok, +1 poi :). –
Qui arriviamo al solito business sull'affidabilità di 'argv [0]' come percorso per il binario. POSIX dice che * dovrebbe * puntare al binario, ma non lo richiede e l'API consente ai programmi di impostarlo su qualcos'altro. Il risultato finale è, di solito funziona, ma non è affidabile. Inoltre, anche se si dispone di un percorso corretto, il file binario può essere collegato in più punti. – dmckee
Si potrebbe provare a eliminare solo l'eseguibile nel programma (FILE * e roba) ... ma visto che quell'eseguibile è ciò che viene eseguito potrebbe non funzionare. Lo vedo come se stessi mangiando te stesso, e per quanto ne so non è possibile, ma potresti certamente provarlo usando il metodo che ho menzionato sopra.
Penso che dipenda dalla piattaforma che si sta utilizzando. In sostanza, una volta caricato l'eseguibile, qualsiasi modifica successiva al file binario non influisce sul programma in esecuzione. In Unix, questo è il caso, ed è possibile utilizzare la chiamata di sistema dello scollegamento.
Non sono sicuro se questo sia vero su Windows o no. Potrebbe non essere consentito cancellare l'immagine eseguibile. Puoi provare l'API di DeleteFile() in Windows.
Se il sistema operativo consente a un programma in esecuzione di eliminare il proprio binario, è sufficiente cercare l'API per l'eliminazione dei file o eseguire un comando system()
corrispondente.
Se il sistema operativo non permette questo, il vostro programma (chiamiamolo A) potrebbe costruire un altro binario, che contiene un altro programma (chiamiamolo B). Quindi, A si chiuderà immediatamente.
programma B avrebbe un singolo ciclo controllando se Un è ancora in esecuzione e appena A si chiude, B cancellerebbe Un binario s'.
Reverse Little John! –
Ma che dire di B - è come un doppio suicidio andato storto. –
Beh, la missione era uccidere A, non è vero? B può riposare in una cartella temporanea e aspettare di essere spazzato via qualche volta. – Imp
Non so che comodamente si può fare in un modo veramente indipendente dalla piattaforma, ma non è stato specificato l'indipendenza dalla piattaforma, in modo da provare le seguenti, codice di stile Linux:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv) {
printf("Read carefully! You cannot print this message again.\n");
return unlink(argv[0]);
}
Quanto vicino è quello che vuoi?
Questa è la più bizzarra digitazione di argomenti a main() che io abbia mai visto. – blueshift
Woow. Funziona. Puoi spiegare questo argomento? – Jack
Questi sono argomenti non standard per 'main', per inciso. Detto questo, serve solo a rendere il codice di esempio più difficile da capire per un nuovo arrivato ... –
- 1. È possibile scrivere direttamente un programma con istruzioni bytecode Java?
- 2. È possibile scrivere un generico varia zip zip in C++?
- 3. È possibile scrivere un sistema operativo completamente in C?
- 4. È possibile ospitare il CLR in un programma C?
- 5. È possibile scrivere un'estensione node.js in C (non C++)?
- 6. Come scrivere un programma di cache friendly in C++?
- 7. È possibile scrivere un verificatore che controlli se un determinato programma implementa un determinato algoritmo?
- 8. Programma C++ veloce, C# GUI, possibile?
- 9. è possibile scrivere su console senza stdlibs? c/C++
- 10. Linux: scrivere un programma C che controlli una shell
- 11. È possibile scrivere un compilatore con Javascript?
- 12. Come scrivere un programma multipiattaforma?
- 13. È possibile scrivere un plugin VLC in Python?
- 14. Com'è possibile scrivere legalmente ::: in C++ e ??? in C#?
- 15. Scrivere un programma C portatile - quali cose considerare?
- 16. È possibile scrivere funzioni nidificate in JavaScript?
- 17. È possibile eseguire un programma Python su un computer senza Python? Che dire di C/C++?
- 18. È possibile disattivare lo stderr in C++?
- 19. È possibile provare/catturare tutto il programma C# completo?
- 20. È possibile avere più di un metodo main() in un programma C#?
- 21. È possibile scrivere un multiplexer per scopi generici in Java?
- 22. È possibile scrivere un tipo di funzione dipendente in Scala?
- 23. È possibile scrivere un file gulp in es6?
- 24. È possibile scrivere vettori in un formato i, j, k?
- 25. È possibile leggere e scrivere in un file contemporaneamente?
- 26. È possibile compilare un programma scritto in Python?
- 27. Un programma C++ è molto più lento di un programma C simile?
- 28. Scrivere un programma "vero" interattivo terminale come vim, htop, ... in C/C++ senza ncurses
- 29. Come scrivere un programma in C per misurare la velocità della cache?
- 30. È possibile sovrascrivere un costruttore in C#?
Probabilmente è possibile scrivere un programma che cancella il file .exe o qualsiasi altra cosa, anche se potrebbe essere necessario saltare alcuni loop poiché in alcuni ambienti il sistema operativo blocca l'exe durante l'esecuzione. –