#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/syscall.h>
// 定义syscall3来调用对应的系统调用
#ifndef SYSCALL_USE_ALT_NAME
#define syscall3(name, a, b, c) \
({ \
long __res; \
__asm__ volatile ( "int $0x80" \
: "=a" (__res) \
: "0" (__NR_##name), "b" ((long)(a)), "c" ((long)(b)), "d" ((long)(c))); \
__res; \
})
#else
#define syscall3(name, a, b, c) \
({ \
long __res; \
__asm__ volatile ( "int $0x80" \
: "=a" (__res) \
: "0" (__NR_##name), "b" ((long)(a)), "c" ((long)(b)), "d" ((long)(c))); \
__res; \
})
#endif
// 定义fsync和fdatasync的包装函数
#define __NR_fsync 146
#define __NR_fdatasync 145
static inline int fsync(int fd) {
return syscall3(fsync, fd, 0, 0);
}
static inline int fdatasync(int fd) {
return syscall3(fdatasync, fd, 0, 0);
}
int main() {
// 打开文件
FILE *fp = fopen("example.txt", "w+");
if (!fp) {
perror("Error opening file");
return -1;
}
// 写入数据
fprintf(fp, "Hello, World!");
// 同步文件数据到磁盘
if (fsync(fileno(fp)) != 0) {
perror("Error in fsync");
}
// 关闭文件
fclose(fp);
return 0;
}
这段代码首先包含了必要的头文件,然后定义了syscall3
宏来调用int 0x80
中断,并通过指定系统调用号和参数执行系统调用。接着,代码定义了fsync
和fdatasync
的内联函数,使用syscall3
进行系统调用。在main
函数中,代码打开文件,写入数据,使用fsync
同步数据到磁盘,然后关闭文件。这个例子展示了如何使用系统调用来执行文件同步操作,并且如何在C语言中进行系统调用的封装。