Si bien no estoy seguro de por qué Macos usa esto en lugar de la funcionalidad C estándar, suponiendo que lo que leí hace años en "Mac OS X Unleashed" es correcto, resulta que aprendí algo nuevo, nuevamente.
Mire el siguiente programa simple en C:
#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
struct timespec ts;
ts.tv_sec = 10;
ts.tv_nsec = 0;
FILE * fp;
fp = fopen("file.txt", "a");
int f = fileno(fp);
if (fp == NULL)
{
printf("Error opening file!\n");
exit(1);
}
struct stat file_stat;
int ret;
ret = fstat (f, &file_stat);
printf("inode number is %d\n", file_stat.st_ino);
nanosleep(&ts, NULL);
printf("Finished sleep, writing to file.\n");
/* print some text */
const char *text = "Write this to the file";
dprintf(f, "Some text: %s\n", text);
/* print integers and floats */
int i = 1;
float py = 3.1415927;
dprintf(f, "Integer: %d, float: %f\n", i, py);
/* printing single characters */
char c = 'A';
dprintf(f, "A character: %c\n", c);
close(f);
}
Compile el programa, ejecútelo en segundo plano y rápidamente mv file.txt file2.txt
ANTES de que el programa imprima "Finalizado el sueño, escribiendo en el archivo". (tienes 10 segundos)
Observe que file2.txt
tiene el resultado de su programa, aunque se movió antes de que el texto se imprimiera en el archivo (a través del descriptor de archivo).
$ gcc myfile.c
$ ./a.out &
[1] 21416
$ inode number is 83956
$ ./mv file.txt file2.txt
$ Finished sleep, writing to file.
[1]+ Done ./a.out
$ cat file2.txt
Some text: Write this to the file
Integer: 1, float: 3.141593
A character: A
DESCARGO DE RESPONSABILIDAD: No he eliminado la lista de "incluir", esto fue rápidamente pirateado para probar un punto.
stat
es un comando más útil aquí quels -di
, ya que le indica el volumen / ID del dispositivo, así como la ID del archivo / número de inodo.