2009-06-26 12 views

risposta

4

No, la libreria standard non ha tale funzionalità.

0

non nativamente, si potrebbe chiamare a Sysinternals' handle.exe come ultima risorsa ...

+0

+1 Ho cercato un'applicazione che funzioni esattamente come handle.exe. Grazie ZombieSheep. – Kei

1

Forse si può solo cercare di ottenere un blocco di scrittura completa? Fallirà se qualcun altro lo ha aperto per leggere o scrivere.

fopen("myfile.txt", "r+") 

Se non è multipiattaforma ed è Win32, allora si può chiedere ancora di più a grana fine serie di serrature.

Vedere here e guardare dwShareMode, valore 0, così come gli altri parametri.

+0

Completamente dipendente dal sistema operativo. –

0

Come dice @Neil Butterworth, la libreria standard non funziona.

In unix è possibile utilizzare fcntl per utilizzare i blocchi di file.

È possibile scrivere un wrapper per la funzione di apertura, che controlla un blocco (e blocca se nessuno esiste) un file se è aperto da nessun altro. Devi scrivere anche un wrapper per chiudere, che rilasci quel blocco sul file chiudi.

+0

Il blocco è puramente di consulenza, quindi questo ti dice solo se qualcun altro ha floccato il file. – ephemient

0

In Windows questo piccolo e sporco trucco funziona (se il file esiste e si ha i permessi giusti)

if ( 0 != rename("c:/foo.txt", "c:/foo.txt") ) { 
    printf("already opened\n"); 
    } 

E 'probabile che il lavoro anche in Linux.

+0

Questo è veramente sporco :-) – Totonga

+0

:) –

+0

Potrei facilmente immaginare qualcuno che aggiunge una "correzione" a un sistema operativo in futuro che ha rotto questo trucco. – Brian

3

Non solo la libreria standard non ha questa funzionalità, non è nemmeno possibile in generale. Potresti (su linux) controllare /proc/*/fd — ma è possibile che il tuo programma non abbia il permesso di farlo su processi di altri utenti (questo è il default in Ubuntu, per esempio).

2

Se si controlla l'altro processo (con codice sorgente), il piano migliore prevede l'uso di blocchi di avviso in entrambi i processi. Questo blocco è definito in POSIX e può essere trasferito su più sistemi operativi.

In Linux, è possibile utilizzare l'utilità lsof per vedere quali file vengono aperti da altri processi.

Questo è limitato a ciò per cui si dispone delle autorizzazioni: è necessario eseguire il controllo come utente privilegiato oppure si ottengono risultati solo per i file aperti dallo stesso utente di quello che esegue il controllo.

Conosco solo l'utilità della riga di comando, non di qualsiasi chiamata di sistema che è possibile utilizzare direttamente dal codice C.

In Linux, è anche possibile attivare mandatory locking per un determinato file system (mount -o mand) e impostare flag speciali sul file (chmod g-x, g + s). Quindi, quando il tuo processo tenta di acquisire un blocco di scrittura, fallirà se un altro processo ha il file aperto. Questo non è quasi mai usato, ma se controlli completamente il sistema in questione, potrebbe essere un'opzione.

+1

Ho provato a guardare il codice sorgente di lsof una volta per vedere come l'hanno fatto e la mia testa è quasi esplosa. La fonte di lsof è una rete di follia e magia nera. –

+2

Suggerirei di usare il fusore su lsof. L'analisi dei risultati sarà molto più semplice. – AFoglia

2

Il seguente codice potrebbe funzionare.

int main(int argc, char ** argv) 
{ 
    int fd = open(argv[1], O_RDONLY); 
    if (fd < 0) { 
     perror("open"); 
     return 1; 
    } 

    if (fcntl(fd, F_SETLEASE, F_WRLCK) && EAGAIN == errno) { 
     puts("file has been opened"); 
    } 
    else { 
     fcntl(fd, F_SETLEASE, F_UNLCK); 
     puts("file has not been opened"); 
    } 

    close(fd); 
    return 0; 
} 
Problemi correlati