如何使用内核系统调用交换两个文本文件的内容
How can I swap contents of two text files with kernel system calls
这是我糟糕的尝试:
//open:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//raad, write, exit:
#include <unistd.h>
#include <stdlib.h>
//renameat2:
#include<stdio.h>
int main(){
int fd1, fd2;
//do I need those ifs?
if((fd1 = open("foo", O_RDWR)) == -1){
write(2, "File failed to open in read/write mode\n", 33);
exit(-1);
}
if((fd2 = open("bar", O_RDWR)) == -1 ){
write(2, "File failed to open in read/write mode\n", 34);
exit(-1);
}
renameat2(AT_FDCWD,fd1,AT_FDCWD,fd2, RENAME_EXCHANGE);
close(fd1);
close(fd2);
exit(0);
}
我正在尝试使用系统调用函数 "renameat2",但出现错误:
main.c:24:3:警告:函数的隐式声明'renameat2';你是说 'rename' 吗?
main.c:24:13: 错误:'AT_FDCWD' 未声明(首次在此函数中使用)
main.c:24:40: 错误:'RENAME_EXCHANGE' 未声明(首次在此函数中使用)
两个问题:
首先,由于 renameat2
不是任何标准的一部分,您需要 #define _GNU_SOURCE
在包含任何头文件之前使用它。有关详细说明,请参阅 man 7 feature_test_macros
。
其次,renameat2
不像其他系统调用那样支持 AT_EMPTY_PATH
(即使支持,也不是您使用它的方式),因此您需要将名称传递给它要重命名的文件的数量,而不是 FD。由此可见,您不需要打开文件。
这是你的代码,同时修复了这两个问题:
#define _GNU_SOURCE
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
int main(){
renameat2(AT_FDCWD,"foo",AT_FDCWD,"bar", RENAME_EXCHANGE);
exit(0);
}
这里有一个更灵活的版本,错误处理更好:
#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
int main(int argc, char *argv[]){
if(argc != 3) {
fputs("Wrong number of arguments\n", stderr);
return 1;
}
if(renameat2(AT_FDCWD, argv[1], AT_FDCWD, argv[2], RENAME_EXCHANGE)) {
perror("renameat2");
return 1;
}
return 0;
}
这是我糟糕的尝试:
//open:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//raad, write, exit:
#include <unistd.h>
#include <stdlib.h>
//renameat2:
#include<stdio.h>
int main(){
int fd1, fd2;
//do I need those ifs?
if((fd1 = open("foo", O_RDWR)) == -1){
write(2, "File failed to open in read/write mode\n", 33);
exit(-1);
}
if((fd2 = open("bar", O_RDWR)) == -1 ){
write(2, "File failed to open in read/write mode\n", 34);
exit(-1);
}
renameat2(AT_FDCWD,fd1,AT_FDCWD,fd2, RENAME_EXCHANGE);
close(fd1);
close(fd2);
exit(0);
}
我正在尝试使用系统调用函数 "renameat2",但出现错误:
main.c:24:3:警告:函数的隐式声明'renameat2';你是说 'rename' 吗?
main.c:24:13: 错误:'AT_FDCWD' 未声明(首次在此函数中使用)
main.c:24:40: 错误:'RENAME_EXCHANGE' 未声明(首次在此函数中使用)
两个问题:
首先,由于 renameat2
不是任何标准的一部分,您需要 #define _GNU_SOURCE
在包含任何头文件之前使用它。有关详细说明,请参阅 man 7 feature_test_macros
。
其次,renameat2
不像其他系统调用那样支持 AT_EMPTY_PATH
(即使支持,也不是您使用它的方式),因此您需要将名称传递给它要重命名的文件的数量,而不是 FD。由此可见,您不需要打开文件。
这是你的代码,同时修复了这两个问题:
#define _GNU_SOURCE
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
int main(){
renameat2(AT_FDCWD,"foo",AT_FDCWD,"bar", RENAME_EXCHANGE);
exit(0);
}
这里有一个更灵活的版本,错误处理更好:
#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
int main(int argc, char *argv[]){
if(argc != 3) {
fputs("Wrong number of arguments\n", stderr);
return 1;
}
if(renameat2(AT_FDCWD, argv[1], AT_FDCWD, argv[2], RENAME_EXCHANGE)) {
perror("renameat2");
return 1;
}
return 0;
}