展示我写的作为对 bmarguiles 回答的评论的内容,
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char **argv) {
char *buffer = 0, *name = 0;
int i;
for (i = 1; i < argc; i++) {
struct stat st;
int fd = open(argv[i], O_RDONLY);
fstat(fd, &st);
buffer = realloc(buffer, st.st_size + 1);
read(fd, buffer, st.st_size);
close(fd);
buffer[st.st_size] = '\0';
name = realloc(name, strlen(argv[i]) + 2);
sprintf(name, "%s~", argv[i]);
symlink(buffer, name);
rename(name, argv[i]);
}
free(buffer);
free(name);
return 0;
}
$ vi f2s.c
...
$ cc -o f2s f2s.c
$ echo -n // 测试
$ ./f2s 测试
$ ls -l 测试
lrwxrwxrwx 1 me me 1 Feb 24 23:17 test -> /
$回声-n/>测试2
$ strace ./f2s test2
打开(“test2”,O_RDONLY)= 3
fstat(3, {st_mode=S_IFREG|0644, st_size=1, ...}) = 0
读取(3,“/”,1)= 1
关闭(3)= 0
符号链接("/", "test2~") = 0
重命名(“test2~”,“test2”)= 0
这只是一个演示;它确实需要更多的错误处理,也许还有更好的临时文件名。