Как я могу поменять содержимое двух текстовых файлов системными вызовами ядра - PullRequest
0 голосов
/ 29 апреля 2020

Вот моя неудачная попытка:

//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'; Вы имели в виду «переименовать»?

main. c: 24: 13: ошибка: «AT_FDCWD» необъявлена ​​(первое использование в этой функции)

main. c: 24: 40: ошибка: «RENAME_EXCHANGE» необъявлено (первое использование в этой функции)

1 Ответ

1 голос
/ 29 апреля 2020

Две проблемы:

Во-первых, поскольку 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...