Ich bin mir nicht sicher, warum MacOS diese Funktion anstelle der Standard-C-Funktionalität verwendet. Vorausgesetzt, dass das, was ich vor Jahren in "Mac OS X Unleashed" gelesen habe, richtig ist, stellte sich heraus, dass ich wieder etwas Neues gelernt habe.
Bitte schauen Sie sich folgendes einfaches C-Programm an:
#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);
}
Kompilieren Sie das Programm, führen Sie es im Hintergrund aus, und mv file.txt file2.txt
BEVOR das Programm "Beendet den Ruhezustand, Schreiben in eine Datei" ausgibt. (Sie haben 10 Sekunden)
Beachten Sie, dass file2.txt
die Ausgabe Ihres Programms zwar verschoben wurde, bevor der Text in die Datei gedruckt wurde (über den Dateideskriptor).
$ 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
HAFTUNGSAUSSCHLUSS: Ich habe die "include" -Liste nicht gekürzt, dies wurde schnell zusammen gehackt, um einen Punkt zu beweisen.
stat
ist hier ein sinnvollerer Befehl alsls -di
, da er Ihnen die Volume- / Geräte-ID sowie die Datei-ID / Inode-Nummer mitteilt.