2010-07-16 6 views
5

Quando proviamo a monitorare una directory usando inotify su Linux, come sappiamo, riceviamo una notifica non appena il file viene creato (prima che l'altro processo termini la scrittura ad esso)come assicurarsi di non leggere un file prima di scrivere la scrittura

c'è un modo efficace per fare in modo che il file non viene letto prima di scrivere ad essa è completata entro l'altro processo?

Potremmo potenzialmente aggiungere una lettura ritardata; ma come tutti sappiamo, è imperfetto.

Per un po 'più chiarezza sullo scenario; i due processi sono in esecuzione come utenti diversi; il carico previsto è di poche centinaia di file creati al secondo.

+0

Suppongo che non sia possibile creare un semaforo con nome per ogni file per garantire che solo 1 processo stia utilizzando un file alla volta? – Gianni

+0

Definisci "finish" ... A meno che il processo non chiuda il file, è possibile determinare se un processo viene "fatto" scrivendo su di esso, anche in linea di principio? – Cogwheel

+0

Hai il controllo dei programmi che leggono/scrivono il file, o ha bisogno di lavorare anche con "qualsiasi programma di terze parti"? –

risposta

1

In base alla tua domanda, sembra che tu stia attualmente monitorando la directory con il flag IN_CREATE (e forse IN_OPEN). Perché non utilizzare anche il flag IN_CLOSE in modo da ricevere una notifica quando il file viene chiuso? Da lì, dovrebbe essere facile tenere traccia di se qualcosa ha il file aperto e saprai che non vuoi ancora provare a leggerlo.

+0

Grazie jamessan; la tua risposta mi ha aiutato ad arrivare a una soluzione che sembra funzionare per me. Ora controllo per IN_CREATE e IN_CLOSE; combinali per selezionare i nuovi arrivi nella directory che sto monitorando! Grazie per l'aiuto. –

0

È possibile controllare /proc/<pid>/fd per vedere se il file è ancora aperto. Se non è elencato lì, puoi essere sicuro che il processo non lo sta più utilizzando.

+0

c'è un modo per trovare il file del file, che viene aperto da un processo esterno; nessuno di cui ho sentito parlare. AFAIK, il file fd è specifico del processo e solo il sistema operativo e il processo conosceranno la relazione tra un file fd e un file su disco; se c'è un modo, sono abbastanza sicuro che sarà disponibile solo per il root. –

+0

@CodeMedic Guarda la dir. Il file fd è un collegamento simbolico al file stesso, quindi non è necessario convertire fd -> nome, tutto ciò che devi fare è usare 'lstat' per vedere a quale file punta il link. – Gianni

+0

es .: casella utente @: ~ # ls -l/proc/1433/fd/0 lr-x ------ 1 root root 64 2010-07-16 15:31/proc/1433/fd/0 ->/dev/null – Gianni

1

Crealo da qualche altra parte, scrivici, chiudilo, quindi rinominalo o mi manca qualcosa di ovvio?

+0

Sì, questo è il modo giusto. Oppure crearlo con un nome temporaneo e rinominarlo al termine. – MarkR

+0

Questo è solo se ho il controllo sul processo! Qui io non! È un pezzo di terze parti. –

-1

forse il comando lsof può essere d'aiuto. Elenca tutti i file aperti. $ man lsof

+0

la domanda qui non riguarda il fare la copia dalla shell. –

Problemi correlati