2009-06-26 35 views

Respuesta

4

No, la biblioteca estándar no tiene tal funcionalidad.

0

no nativa, se podría llamar a Sysinternals' handle.exe como último recurso ...

+0

+1 He estado buscando una aplicación que hace exactamente lo que hace handle.exe. Gracias ZombieSheep. – Kei

1

Tal vez usted podría tratar de obtener un bloqueo de escritura completo? Fallará si alguien más lo tiene abierto para leer o escribir.

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

Si no es multiplataforma y es Win32, entonces se puede solicitar conjunto aún más fino de esclusas.

Consulte here y mire dwShareMode, el valor de 0, así como los otros parámetros.

+0

Completamente dependiente del sistema operativo. –

0

Como dice @Neil Butterworth, la biblioteca estándar no lo hace.

En Unix puede usar fcntl para usar bloqueos de archivos.

Puede escribir un contenedor para su función abierta, que busca un candado (y bloquea si no existe) un archivo si es abierto por nadie más. Debes escribir un wrapper para cerrar también, que libera ese bloqueo en el cierre del archivo.

+0

El bloqueo es puramente consultivo, por lo que esto solo indica si otra persona ha agrupado el archivo. – ephemient

0

En Windows este pequeño y sucio truco funcionará (si el archivo existe y tiene los permisos correctos)

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

Es probable que funcione también en Linux.

+0

Este es realmente sucio :-) – Totonga

+0

:) –

+0

podría fácilmente imaginar a alguien añadiendo una "solución" a un sistema operativo en el futuro que se rompió este truco. – Brian

3

No solo la biblioteca estándar no tiene esta funcionalidad, ni siquiera es posible en general. Podría (en Linux) marcar /proc/*/fd — pero es posible que su programa no tenga permiso para hacerlo en procesos de otros usuarios (este es el valor predeterminado en Ubuntu, por ejemplo).

2

Si controla el otro proceso (tiene código fuente), el mejor plan es usar bloqueos de aviso en ambos procesos. Este bloqueo se define en POSIX y será portátil en todos los sistemas operativos.

En Linux, puede usar la utilidad lsof para ver qué archivos están abiertos por otros procesos.

Esto se limita a lo que tiene permisos: tiene que hacer el control como usuario con privilegios, o solo obtendrá resultados para archivos abiertos por el mismo usuario que el que realiza el cheque.

Solo conozco la utilidad de línea de comandos, no de ninguna llamada al sistema que pueda usar directamente desde el código C.

En Linux, también es posible encender mandatory locking para un sistema de archivos determinado (mount -o demanda), y establecer marcas especiales sobre el archivo (chmod g-x, g + s). Luego, cuando su proceso intente adquirir un bloqueo de escritura, fallará si otro proceso tiene el archivo abierto. Esto casi nunca se usa, pero si controla completamente el sistema en cuestión, puede ser una opción.

+1

Traté de ver el código fuente lsof una vez para ver cómo lo hicieron y mi cabeza casi explotó. La fuente de lsof es una red de locura y magia negra. –

+2

Sugeriría usar fuser sobre lsof. Analizar los resultados será mucho más simple. – AFoglia

2

El código siguiente puede trabajar.

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; 
} 
Cuestiones relacionadas