如何使用内核系统调用交换两个文本文件的内容

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;
}