2012-07-05 13 views
6

QNX (Neutrino 6.5.0) utiliza una implementación de código abierto de ksh como su caparazón. Una gran cantidad de los scripts proporcionados, incluidos los scripts de inicio del sistema, el uso construye comoDiferencia entre "archivo de prueba" y "archivo de prueba -f archivo"

if ! test /dev/slog -ef /dev/slog; then 
    # do something 
fi 

para comprobar si existe un administrador de recursos o no en el sistema de archivos. He buscado y solo pude encontrar explicaciones muy claras que -ef comprueba si los dos parámetros son de hecho el mismo archivo. Como el nombre de archivo especificado es el mismo, parece reducirse a verificar que el archivo exista.

He comprobado el comportamiento de test -a y test -e (ambos parecen comprobar la existencia de archivos de cualquier tipo de archivo según los diversos documentos que he leído) y parece que también funcionan.

¿Hay alguna diferencia en las comprobaciones realizadas entre -ef y -a/-e? ¿Está usando -ef algún tipo de intento de proteger contra una condición de carrera en la existencia del archivo?

+0

Parece que podría estar comprobando que el archivo existe para dos llamadas a stat() diferentes. ¿La entrada/dev es eliminada por el controlador/administrador (por ejemplo, después de ser cerrada) solo si alguien verifica su existencia? – jhfrontz

+0

@jhfrontz: no estoy del todo seguro de lo que quiere decir pero (como ejemplo) el pseudodispositivo/dev/slog solo se elimina cuando se mata el controlador, lo que normalmente no ocurriría en el medio de la llamada a 'prueba' ya que es parte del script inicial de inicio del sistema. En el caso normal de/dev/slog, un proceso puede escribir en el dispositivo para iniciar sesión en un archivo/consola/memoria, y aunque puede terminar con un nombre de archivo diferente, el dispositivo expuesto en/dev debe ser el mismo que antes del escribe en/dev/slog. – tinman

+0

Estoy especulando que stat'ing el dispositivo tiene algún efecto secundario (por ejemplo, lo que hace que el controlador/administrador haga algún tipo de mantenimiento) de modo que cuando se complete la primera llamada stat() de 'test', el archivo/El dispositivo es eliminado/reemplazado por el controlador, lo que provoca que el segundo stat() obtenga información diferente, lo que a su vez hace que falle la 'prueba '. Ha pasado un tiempo desde que utilicé QNX, pero [la página de manual de slogger] (http: //www.qnx.com/developers/docs/6.3.0SP3/neutrino/utilities/s/slogger.html) sugiere que existen efectos secundarios al interactuar con/dev/slog (por ejemplo, al desvincularlo, se borra el registro). – jhfrontz

Respuesta

4

Revisando el strace en la copia de Ubuntu Linux de ksh no se encontraron diferencias sustanciales. Una llamada a stat frente a dos.

$ strace test /tmp/tmp.geLaoPkXXC -ef /tmp/tmp.geLaoPkXXC 

mostraron lo siguiente:

mmap(NULL, 7220736, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f11dc80b000 
close(3)        = 0 
stat("/tmp/tmp.geLaoPkXXC", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 
stat("/tmp/tmp.geLaoPkXXC", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 
close(1)        = 0 
close(2)        = 0 

... mientras que

$ strace test -a /tmp/tmp.geLaoPkXXC 

mostró esto:

fstat(3, {st_mode=S_IFREG|0644, st_size=7220736, ...}) = 0 
mmap(NULL, 7220736, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6b49e2b000 
close(3)        = 0 
stat("/tmp/tmp.geLaoPkXXC", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 
close(1)        = 0 
close(2)        = 0 

Una stat vs dos.

$ ksh --version 
    version   sh (AT&T Research) 93u 2011-02-08 
1

No sabemos cómo el código usa la estadística exactamente sin el código, tenemos que encontrar la diferencia a través del código.

/* code for -ef */ 
return (stat (argv[op - 1], &stat_buf) == 0 
        && stat (argv[op + 1], &stat_spare) == 0 
        && stat_buf.st_dev == stat_spare.st_dev 
        && stat_buf.st_ino == stat_spare.st_ino); 


/* code for -e/-a */ 
    case 'a':     /* file exists in the file system? */ 
    case 'e': 
     return stat (argv[pos - 1], &stat_buf) == 0; 

lo tanto, si los nombres son los mismos y dos stat() con el mismo nombre devolverá el mismo valor, entonces, test -a/-e file es lo mismo que test file -ef file. Sabemos que la primera condición es verdadera, y sabemos que la segunda condición también es cierta a partir de los comentarios de @tinman

Cuestiones relacionadas