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.txtPRIMA che il programma stampi "Sospensione terminata, scrittura su file". (hai 10 secondi)
Si noti che file2.txtha 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.