2017-01-14 7 views
4

В справочной странице для renameat2() указано, что мне нужно включить <stdio.h>, но это не сработает.Отсутствует функция системного вызова «renameat2» на Ubuntu 16.04

Когда я

cd /usr/include 
grep -r renameat2 

я вижу, что __SYSCALL определяется, но без функции Glibc. Флаги для системного вызова доступны в <linux/fs.h>, но это не включено.

+0

Какая версия Glibc у вас есть? Какая версия ядра Linux? –

+0

Ядро Linux 4.4 (syscall был добавлен в 3.10) Версия Glibc - 2.23 – Lothar

ответ

5

Хорошо я нашел ответ здесь, общую проблему с glibс не добавлять системные вызовы и справочной страницу отсутствующей в

Примечание: Там нет Glibc обертки для этого системного вызова; см. ПРИМЕЧАНИЯ.

примечание, которое указано на других страницах. Так что я запутался.

Найден ответ, прочитав эту статью https://lwn.net/Articles/655028/

И это код

#include <sys/syscall.h> 
#include <linux/fs.h> 

int src_fd = open("old_dir", O_PATH); 
itn dest_fd = open("new_dir", O_PATH); 
const char* src_path = "old_name.txt"; 
const char* dest_path = "new_name.txt"; 

unsigned int flags = RENAME_NOREPLACE; 
int rc = syscall(SYS_renameat2, src_fd src_path, dest_fd, dest_path, flags);