ในขณะที่ฉันไม่แน่ใจว่าทำไม macos ใช้สิ่งนี้แทนที่จะใช้ฟังก์ชั่น C มาตรฐานโดยสมมติว่าสิ่งที่ฉันอ่านเมื่อหลายปีก่อนใน "Mac OS X Unleashed" ถูกต้องแล้วกลับกลายเป็นว่าฉันเรียนรู้สิ่งใหม่อีกครั้ง
โปรดดูโปรแกรม 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);
}
รวบรวมโปรแกรมเรียกใช้ในพื้นหลังและอย่างรวดเร็วmv file.txt file2.txt
ก่อนที่โปรแกรมจะพิมพ์ "เสร็จสิ้นการสลีปเขียนเป็นไฟล์" (คุณมี 10 วินาที)
โปรดสังเกตว่าfile2.txt
มีเอาต์พุตของโปรแกรมของคุณแม้ว่าจะถูกย้ายไปก่อนที่ข้อความจะถูกพิมพ์ไปยังไฟล์ (ผ่านตัวอธิบายไฟล์)
$ 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
การปฏิเสธความรับผิด: ฉันยังไม่ได้ตัดแต่งรายการ "รวม" นี้ถูกแฮ็คเข้าด้วยกันอย่างรวดเร็วเพื่อพิสูจน์จุด
stat
เป็นคำสั่งที่มีประโยชน์มากกว่าที่นี่ls -di
เพราะมันจะบอกคุณถึงปริมาณ / หมายเลขอุปกรณ์รวมถึงหมายเลขไฟล์ / หมายเลขไอโหนด