Chociaż nie jestem pewien, dlaczego macos używa tego zamiast standardowej funkcjonalności C, zakładając, że to, co przeczytałem lata temu w „Mac OS X Unleashed” jest prawidłowe, okazuje się, że znowu nauczyłem się czegoś nowego.
Proszę spojrzeć na następujący prosty program 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);
}
Skompiluj program, uruchom go w tle i szybko mv file.txt file2.txt
ZANIM program wydrukuje „Zakończony sen, zapis do pliku”. (masz 10 sekund)
Zauważ, że file2.txt
ma wyjście twojego programu, chociaż zostało ono przeniesione przed wydrukowaniem tekstu do pliku (poprzez deskryptor pliku).
$ 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
ZASTRZEŻENIE: Nie przyciąłem listy „uwzględnij”, ta została szybko zhakowana razem, aby udowodnić, że ma rację.
stat
jest to bardziej przydatne poleceniels -di
, ponieważ podaje ono identyfikator woluminu / urządzenia, a także identyfikator pliku / numer i-węzła.