如何创建硬链接?程序中硬链接文件不同步问题求助
问题分析与修复
你的代码核心问题是硬链接创建失败,导致两个文件无法同步,具体原因和修复如下:
关键问题点
link(tlink, blahblah)调用失败:link()函数要求第二个参数(新硬链接路径,这里是void.txt)必须不存在。但你在调用link()前,已经通过open(O_CREAT | O_TRUNC)创建并覆盖了void.txt,此时link()会因为目标文件已存在而返回-1,硬链接根本没建立。- 缺失错误处理:代码没有检查
open()、write()、link()的返回值,无法及时发现调用失败的情况。
修正后的代码
以下是修复后的版本,先确保硬链接创建成功,再操作文件内容:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <errno.h> const char* tlink = "e.txt"; const char* trapcontent = "XP0S3D"; const char* blahblah = "void.txt"; void traplink() { // 先删除已存在的void.txt(如果有),确保link可以成功 if (unlink(blahblah) == -1 && errno != ENOENT) { perror("unlink void.txt failed"); exit(EXIT_FAILURE); } // 创建硬链接:将void.txt作为e.txt的硬链接 int ret = link(tlink, blahblah); if (ret == -1) { perror("link failed"); exit(EXIT_FAILURE); } printf("Hard link created successfully!\n"); } int main() { traplink(); // 写入e.txt,此时void.txt作为硬链接会同步内容 int fd = open(tlink, O_WRONLY | O_TRUNC, 0644); if (fd == -1) { perror("open e.txt failed"); exit(EXIT_FAILURE); } ssize_t write_len = write(fd, trapcontent, strlen(trapcontent)); if (write_len != strlen(trapcontent)) { perror("write failed"); close(fd); exit(EXIT_FAILURE); } close(fd); // 验证:读取void.txt的内容 fd = open(blahblah, O_RDONLY); if (fd == -1) { perror("open void.txt failed"); exit(EXIT_FAILURE); } char buf[100] = {0}; ssize_t read_len = read(fd, buf, sizeof(buf)-1); if (read_len == -1) { perror("read failed"); close(fd); exit(EXIT_FAILURE); } printf("void.txt content: %s\n", buf); close(fd); return 0; }
修复说明
- 先调用
unlink()删除已存在的void.txt(如果文件不存在,unlink()返回-1但errno为ENOENT,属于正常情况),确保link()可以成功创建硬链接。 - 添加了完整的错误处理逻辑,通过
perror()打印具体错误信息,方便调试。 - 硬链接创建成功后,操作任意一个文件(比如
e.txt),另一个文件(void.txt)会自动同步内容,这是硬链接的特性——多个路径指向同一个inode,共享内容。
内容的提问来源于stack exchange,提问作者Xposed
相关产品推荐
相关产品推荐

