2011-12-06 11 views
6

Código:¿Por qué escribir en un descriptor de archivo después de que el archivo de destino haya sido eliminado?

int main(int argc, char **argv) 
{ 
    int fd = open("test.txt", O_CREAT|O_RDWR, 0200|0400); 
    if(fd == -1) 
    { 
     printf("failure to oepn"); 
     exit(-1); 
    } 
    int iRet = write(fd, "aaaaaaaaaa", 10); 

    if(iRet == -1) 
    { 
     printf("failure to writer"); 
     exit(-1); 
    } 
    sleep(10); 
    printf("You must remove"); 
    iRet = write(fd, "bbbbbbbbbb", 10); 

    if(iRet == -1) 
    { 
     printf("failure to after writer"); 
     exit(-1); 
    } 

    exit(0); 
} 

durante el sueño(), elimina el test.txt, pero el proceso de escritura con éxito por qué? si una instancia de registro "Singleton", elimina el archivo en el disco.write se realiza correctamente, pero no puede obtener nada.

class log 
{ 
public: 
    void loggerWriter(std::string str); 
    int fd; 
}; 

log::log(std::string filename):fd(-1) 
{ 
    fd = open(filename.c_str(), O_CREAT|) 
    //... 
} 

log::loggerWriter(std::string str) 
{ 
    writer(fd, str.c_str(), str.size()); 
} 

int main() 
{ 
    log logger("text.txt"); 
    //... 
    //I want to know the text.txt the text.txt have delete on the disk or not. 
    //if delete i can create another file to log. 
} 

"unlink" no puede resolver este problema.

+0

El archivo existe, es solo que el truco de eliminación se utiliza para crear un archivo temporal oculto que se elimina físicamente en close()/exit(). – moshbear

+1

No se realiza ningún archivo temporal oculto. Hay un archivo sin nombre, y hay su inodo con recuento de referencia! = 0. –

+0

@MaximYegorushkin: el inodo en el disco tiene 0 nlink. El inodo en el núcleo tiene! = 0 refcount. Si el sistema se bloquea, la próxima vez que se ejecute 'fsck', notará los 0 nlinks y dtime = 0 y eliminará el archivo. – ninjalj

Respuesta

12

Los manual page for unlink(2) indica claramente:

unlink() borra un nombre del sistema de archivos. Si ese nombre fue el último enlace a un archivo y no hay procesos que tengan el archivo abierto, el archivo se borró de y el espacio que estaba usando está disponible para su reutilización.

Si el nombre es el último enlace a un archivo, pero ningún proceso sigue teniendo el archivo abierto el archivo permanecerá en existencia hasta el último archivo descriptor refiriéndose a ella se cierra.

Como caf notas de manera excelente en los comentarios:

La escritura() tiene éxito porque escribe en el archivo, que todavía existe en este momento a pesar de que ya no tiene un nombre. El nombre de archivo y el archivo en sí son distintos y tienen vidas diferentes.

+2

Lo que significa que: 'write()' es correcto porque se escribe en el archivo, que todavía existe en este punto aunque ya no tenga un nombre. El nombre de archivo y el archivo en sí son distintos y tienen vidas diferentes. – caf

+0

@caf Gracias. Incorporé tu comentario en mi respuesta. – cnicutar

+0

en el proceso, ¿cómo se borró el archivo? – OCaml

Cuestiones relacionadas