come trovare un loop nel file system in Linux? sto indicizzando tutti i file per rendere veloce la ricerca (O (1)) ... sto usando il linguaggio di programmazione c per implementare usando le funzioni della libreria in dir.h .... Posso scansionare l'intero file system ma entra un ciclo se c'è un loop nel filesystem (esempio loop mount) ... come trovare il loop nel file system .. ho visto il comando updatedb di segnalazione quando c'è un loop nel file system ... non capisco la logica ... Qualcuno può aiutare a trovare una soluzione per questo?come trovare un loop nel file system?
risposta
ho trovato questo interessante commento qui su finding loops in a DAG:
Steinar H. Gunderson ha scritto:
On Thu, 26 Feb 2004 00:28:32 +0100, Orlondow ha scritto:
... riprodotto anche nella Cormen-Leiserson-Rivest, IIC. Quale è più facile da trovare .
Sì, io in realtà sono Cormen et al, ma non è mai mi ha colpito per cercare "componenti fortemente connesse" quando volevo rilevamento ciclo. Grazie, lo invierò a . :-)
Per trovare un ciclo in un grafo orientato (non si cura quale ciclo) fintanto come esiste uno, non c'è bisogno di andare in mare con SCC. Pianura vecchia profondità prima ricerca DFS (nello stesso capitolo di CLRS) è sufficiente.
Quindi, grosso modo, mentre si attraversa l'albero delle directory, creare un DAG che rappresenta la struttura dell'albero con i dati sul nodo che si riferiscono all'inode del file. Quindi, è sufficiente verificare di non visitare più di una volta il nodo.
In Grafici orientati, non in DAG.È abbastanza ovvio che non ci sono cicli nei Grafici Aciclici Diretti :) – Ben
Ah hai trovato il mio errore intenzionale che ho messo lì per testarti –
Questo è più comunemente indicato come un "ciclo". Quindi vuoi implementare il "rilevamento del ciclo". Ci sono molti modi per farlo; Non so se questo è per il lavoro a casa o meno, ma un metodo semplice, non necessariamente il più ottimale, è attraverso l'inseguimento del puntatore.
Il modo generale per impedire la scansione dei nodi in un grafico è contrassegnare i nodi mentre vengono passati e quindi ignorare i nodi contrassegnati. Questo non è molto pratico se non si desidera modificare il grafico su cui si sta eseguendo la scansione, quindi è necessario un modo per contrassegnare i nodi esternamente. Il modo più semplice con cui posso pensare di farlo sotto Linux è di memorizzare un dispositivo/inode per ogni directory che visiti. Quindi, quando guardi una directory, per prima cosa controlla di non aver già visto nessuna directory con lo stesso dispositivo/inode. Questo non solo gestisce i cicli, ma anche gli alberi che si fondono l'uno nell'altro.
Per ottenere il numero dispositivo/inode, dare un'occhiata alle funzioni stat/fstat e ai membri st_dev e st_ino della struttura delle statistiche.
Per la memorizzazione dei dati, probabilmente stai cercando uno hash-table o un albero binario.
Forse sto essendo un po 'debole qui, ma non sono i due modi in cui è possibile creare un ciclo:
- di creare un collegamento simbolico
- montando qualcosa di due volte
Per far fronte a questi, è possibile ottenere un elenco dei supporti prima di iniziare l'indicizzazione e, se non tutti, tranne il primo degli stessi file, e si possono ignorare i collegamenti quando li si incontra nel processo di indicizzazione.
Modo semplice. Basta fare una prima camminata dell'albero della directory, mantenendo una pila di nodi sopra di te mentre vai. In ogni nodo che visiti, se quel nodo è già nello stack, hai un ciclo.
// here's a stack of nodes
node stack[1000];
walk(node, level){
if (node in stack[0..level-1]) then there is a cycle
else
stack[level] = node
for each subnode x of node
walk(x, level+1)
}
Questo non è efficiente .. io sto cercando un algoritmo efficiente – suresh
@suresh: è solo inefficiente quando ci sono sottostrutture condivise. Se questo è troppo di un problema, è necessario contrassegnare i nodi come "visitati". –
Come altri hanno detto, non v'è alcuna cosa come un ciclo in un file system, se ci si rende conto che il percorso è parte di un nome di file, a meno che il suo un link simbolico ciclico.
Ad esempio, se si avvia qualche distro (diciamo Debian) su un dispositivo ad anello, o anche su una directory, e lo si fa su una macchina Debian, si è ora duplicato un sacco di cose.
Ad esempio, si supponga di eseguire Debian Lenny e di riavviarne una copia minima in/lenny.
/lenny/usr/* sarà uguale a/usr/*. Non esiste un modo "economico" per evitare questo.
Dal momento che si sta già chiamando uno stat() su ciascun nodo (sto supponendo che si sta utilizzando FTW()/ftw64(), si può anche:
- Avere FTW()' s callback inserisce il nome del nodo in una matrice, che ha membri della struttura che possono archiviare un hash del file che è improbabile collidere, md5 non lo taglierà per questo
- Aggiorna una tabella hash basata su quel digest e il nome del file (non il percorso)
Questo non è un pericolo di velocizzare la scansione, ma lo farà ridurre in modo significativo il tempo necessario per la ricerca.
Se si utilizzano i thread in modo corretto e si imposta l'affinità, l'hashing e l'indicizzazione possono avvenire su un core mentre l'altro è associato ai/o (quando sono disponibili più core).
Tuttavia, 'solo' il controllo di montaggi duplicati non sarà una cura, inoltre sono sicuro che il programma vorrebbe restituire le posizioni di tutti i file denominati 'foo', anche se ci sono quattro copie identiche a citare.
Btw. Non è necessario cercare il ciclo nel file system.
Si sta indicizzando l'intero disco. Quindi non è necessario seguire collegamenti simbolici poiché ogni file deve essere accessibile in modo normale (senza collegamenti simbolici). Hai solo bisogno di controllare i punti di mount se alcuni dischi sono montati più di una volta, ignorando semplicemente i punti di riposo del mount.
- 1. Node-Webkit: come creare un file nel file system locale?
- 2. come posso copiare file nel file system di Android?
- 3. Come trovare file in formato DOS in un file system linux
- 4. Vuoi memorizzare dati binari nel database o nel file system?
- 5. File system C++ 11 (VS2012)
- 6. "lsof" mostra un file come (cancellato), ma posso ancora vedere nel file system
- 7. Come inviare l'output di traccia a un file nel file system?
- 8. RSACryptoServiceProvider CryptographicException System Impossibile trovare il file specificato in ASP.NET
- 9. Esegui una directory di file system locale come input di un Mapper nel cluster
- 10. Dimensione blocco file system
- 11. Javascript salva dati nel file system (con prompt utente)
- 12. Ottieni restrizioni file system
- 13. È possibile salvare oggetti persistenti nel file system
- 14. dove nel file system è conservato lo storage Silverlight isolato?
- 15. File system basato su tag
- 16. Bug nel file system zip JDK di Oracle, come si scrive un SSCCE per riprodurlo?
- 17. JSON non esiste nel namespace System
- 18. Inserimento di file system Android
- 19. E 'possibile creare un VectorDrawable da File System (* .xml File)
- 20. bash popola un array nel loop
- 21. Come verificare le operazioni di file system
- 22. Come posso rappresentare i collegamenti simbolici di un file system in un hash Perl?
- 23. Memoria database vs file system
- 24. Come si costruisce un file system di database (DBFS)?
- 25. query per il backup di un database in un altro luogo nel file system
- 26. File system filename escape? C#
- 27. Accelerazione dell'accesso al file system?
- 28. File system distribuito per. NET
- 29. File system che utilizza tag anziché cartelle?
- 30. Come trovare parametri supportati nel file di configurazione Tesseract OCR
L'overflow dello stack è un po 'ostile per i nuovi utenti. Quando si vota qualcuno, si prega di lasciare un commento che spieghi perché lo hai fatto e qualche suggerimento su cosa dovrebbero fare per migliorarlo. –