Anche se non sono sicuro del motivo per cui macos utilizza questa funzionalità anziché la funzionalità C standard, supponendo che ciò che ho letto anni fa in "Mac OS X Unleashed" sia corretto, si scopre che ho imparato di nuovo qualcosa di nuovo.
Si prega di guardare il seguente semplice programma 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);
}
Compilare il programma, eseguirlo in background e rapidamente mv file.txt file2.txt
PRIMA che il programma stampi "Sospensione terminata, scrittura su file". (hai 10 secondi)
Si noti che file2.txt
ha l'output del programma sebbene sia stato spostato prima che il testo fosse stampato nel file (tramite il descrittore di file).
$ 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
DISCLAIMER: Non ho eliminato l'elenco "include", questo è stato rapidamente violato insieme per dimostrare un punto.
stat
è un comando più utile dils -di
, poiché indica il volume / ID dispositivo, nonché l'ID file / numero di inode.