Две проблемы:
Во-первых, поскольку 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;
}