g++, linux: syncfs was not declared in this scope.

Phoenix

Думаю лучше сюда, чем в h'n's.

 $ g++ main.cpp
main.cpp: In function 'int main':
main.cpp:10:14: error: 'syncfs' was not declared in this scope
$ cat main.cpp
#include <stdio.h>
#include <unistd.h>

int main
{
char buf[] = "a";
FILE *fp = fopen("aaa.txt", "wb");
fwriteconst void*)buf, 1, 1, fp);
sync;
syncfs(fp);
fclose(fp);
return 0;
}

в мане написано
    Feature Test Macro Requirements for glibc (see feature_test_macros(7:

sync:
_BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED

syncfs:
_GNU_SOURCE

VERSIONS
syncfs first appeared in Linux 2.6.39.

CONFORMING TO
sync: SVr4, 4.3BSD, POSIX.1-2001.

syncfs is Linux-specific.


в общем, все ругают мою установленную linuxmint-debian-edition. Говорят, что на ubuntu всё супер.
я вот не понимаю, неужели библиотеки различаются? в unistd.h действительно нет syncfs.
ещё изыскания.
   $ find /usr/include -name "*.h" |xargs grep -n -b5 --color=auto "syncfs"
/usr/include/asm-generic/unistd.h-677-21748-#define __NR_open_by_handle_at 265
/usr/include/asm-generic/unistd.h-678-21791-__SC_COMP(__NR_open_by_handle_at, sys_open_by_handle_at, \
/usr/include/asm-generic/unistd.h-679-21850- compat_sys_open_by_handle_at)
/usr/include/asm-generic/unistd.h-680-21883-#define __NR_clock_adjtime 266
/usr/include/asm-generic/unistd.h-681-21914-__SC_COMP(__NR_clock_adjtime, sys_clock_adjtime, compat_sys_clock_adjtime)
/usr/include/asm-generic/unistd.h:682:21989:#define __NR_syncfs 267
/usr/include/asm-generic/unistd.h:683:22013:__SYSCALL(__NR_syncfs, sys_syncfs)
/usr/include/asm-generic/unistd.h-684-22048-#define __NR_setns 268
/usr/include/asm-generic/unistd.h-685-22071-__SYSCALL(__NR_setns, sys_setns)
/usr/include/asm-generic/unistd.h-686-22104-#define __NR_sendmmsg 269
/usr/include/asm-generic/unistd.h-687-22130-__SC_COMP(__NR_sendmmsg, sys_sendmmsg, compat_sys_sendmmsg)
/usr/include/asm-generic/unistd.h-688-22190-#define __NR_process_vm_readv 270
--
/usr/include/x86_64-linux-gnu/bits/syscall.h-245-8944-#define SYS_swapon __NR_swapon
/usr/include/x86_64-linux-gnu/bits/syscall.h-246-8975-#define SYS_symlink __NR_symlink
/usr/include/x86_64-linux-gnu/bits/syscall.h-247-9008-#define SYS_symlinkat __NR_symlinkat
/usr/include/x86_64-linux-gnu/bits/syscall.h-248-9045-#define SYS_sync __NR_sync
/usr/include/x86_64-linux-gnu/bits/syscall.h-249-9072-#define SYS_sync_file_range __NR_sync_file_range
/usr/include/x86_64-linux-gnu/bits/syscall.h:250:9121:#define SYS_syncfs __NR_syncfs
/usr/include/x86_64-linux-gnu/bits/syscall.h-251-9152-#define SYS_sysfs __NR_sysfs
/usr/include/x86_64-linux-gnu/bits/syscall.h-252-9181-#define SYS_sysinfo __NR_sysinfo
/usr/include/x86_64-linux-gnu/bits/syscall.h-253-9214-#define SYS_syslog __NR_syslog
/usr/include/x86_64-linux-gnu/bits/syscall.h-254-9245-#define SYS_tee __NR_tee
/usr/include/x86_64-linux-gnu/bits/syscall.h-255-9270-#define SYS_tgkill __NR_tgkill
--
/usr/include/x86_64-linux-gnu/asm/unistd_64.h-672-21514-__SYSCALL(__NR_name_to_handle_at, sys_name_to_handle_at)
/usr/include/x86_64-linux-gnu/asm/unistd_64.h-673-21571-#define __NR_open_by_handle_at 304
/usr/include/x86_64-linux-gnu/asm/unistd_64.h-674-21608-__SYSCALL(__NR_open_by_handle_at, sys_open_by_handle_at)
/usr/include/x86_64-linux-gnu/asm/unistd_64.h-675-21665-#define __NR_clock_adjtime 305
/usr/include/x86_64-linux-gnu/asm/unistd_64.h-676-21698-__SYSCALL(__NR_clock_adjtime, sys_clock_adjtime)
/usr/include/x86_64-linux-gnu/asm/unistd_64.h:677:21747:#define __NR_syncfs 306
/usr/include/x86_64-linux-gnu/asm/unistd_64.h:678:21799:__SYSCALL(__NR_syncfs, sys_syncfs)
/usr/include/x86_64-linux-gnu/asm/unistd_64.h-679-21834-#define __NR_sendmmsg 307
/usr/include/x86_64-linux-gnu/asm/unistd_64.h-680-21863-__SYSCALL(__NR_sendmmsg, sys_sendmmsg)
/usr/include/x86_64-linux-gnu/asm/unistd_64.h-681-21902-#define __NR_setns 308
/usr/include/x86_64-linux-gnu/asm/unistd_64.h-682-21928-__SYSCALL(__NR_setns, sys_setns)
/usr/include/x86_64-linux-gnu/asm/unistd_64.h-683-21961-#define __NR_getcpu 309
--
/usr/include/x86_64-linux-gnu/asm/unistd_32.h-347-9869-#define __NR_fanotify_mark 339
/usr/include/x86_64-linux-gnu/asm/unistd_32.h-348-9900-#define __NR_prlimit64 340
/usr/include/x86_64-linux-gnu/asm/unistd_32.h-349-9928-#define __NR_name_to_handle_at 341
/usr/include/x86_64-linux-gnu/asm/unistd_32.h-350-9963-#define __NR_open_by_handle_at 342
/usr/include/x86_64-linux-gnu/asm/unistd_32.h-351-9999-#define __NR_clock_adjtime 343
/usr/include/x86_64-linux-gnu/asm/unistd_32.h:352:10030:#define __NR_syncfs 344
/usr/include/x86_64-linux-gnu/asm/unistd_32.h-353-10066-#define __NR_sendmmsg 345
/usr/include/x86_64-linux-gnu/asm/unistd_32.h-354-10093-#define __NR_setns 346
/usr/include/x86_64-linux-gnu/asm/unistd_32.h-355-10117-#define __NR_process_vm_readv 347
/usr/include/x86_64-linux-gnu/asm/unistd_32.h-356-10151-#define __NR_process_vm_writev 348
/usr/include/x86_64-linux-gnu/asm/unistd_32.h-357-10186-

 $15:57 garry ~(0/1)$ cat /usr/include/unistd.h | grep include
#include <features.h>
#include <bits/posix_opt.h>
# include <bits/environments.h>
#include <bits/types.h>
#include <stddef.h>
#include <bits/confname.h>
# include <getopt.h>
# include <bits/unistd.h>
$15:57 garry ~(0/1)$ cat /usr/include/unistd.h | grep syncfs
$15:58 garry ~(0/1)$ cat /usr/include/bits/unistd.h | grep syncfs
cat: /usr/include/bits/unistd.h: No such file or directory
$15:58 garry ~(0/1)$ find /usr/include -name "unistd.h"
/usr/include/asm-generic/unistd.h
/usr/include/unistd.h
/usr/include/linux/unistd.h
/usr/include/x86_64-linux-gnu/bits/unistd.h
/usr/include/x86_64-linux-gnu/sys/unistd.h
/usr/include/x86_64-linux-gnu/asm/unistd.h
$15:58 garry ~(0/1)$ cat /usr/include/linux/unistd.h | grep syncfs
$15:58 garry ~(0/1)$ cat /usr/include/x86_64-linux-gnu/bits/unistd.h | grep syncfs
$15:59 garry ~(0/1)$ cat /usr/include/x86_64-linux-gnu/sys/unistd.h | grep syncfs
$15:59 garry ~(0/1)$ cat /usr/include/x86_64-linux-gnu/asm/unistd.h | grep syncfs

я переустанавливал ядро, но вроде как .h оно ж не трогает. Может что-то недоустановил, в общем, куда копать?

Serab

Какие версии ядра и glibc?

Phoenix

$ uname -a
Linux garry 3.2.9 SMP Fri Aug 31 16:51:21 MSK 2012 x86_64 GNU/Linux
$ ldd --version
ldd (Debian EGLIBC 2.13-27) 2.13
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

это?

procenkotanya

В glibc только с 2.14: http://www.cygwin.org/ml/libc-hacker/2011-03/msg00005.html

Serab

из моего мана:
VERSIONS
syncfs first appeared in Linux 2.6.39; library support was added to
glibc in version 2.14.

Phoenix

ясно, спасибо!
а оно с ядром вместе ставится? Это я его мог затереть?
его обновить как? glibc в списке пакетов что-то не значитя.
Нужно видимо сделать что-то вроде "make installworld". или в линуксе это всё в ядре?
PS: syncfs и fsynс чем-то отличаются? Если я везде заменю syncfs на fsynс мне там руки не оторвут, что всё медленно стало?

Serab

не, ядро отдельно, glibc — отдельно, надо обновить пакет, называться он может немного по-другому, как в минте, не знаю.

Anturag

а оно с ядром вместе ставится?
Есть ядро, есть хедера ядра, есть libc и есть хедера libc, это всё разные вещи, очевидно.
glibc в списке пакетов что-то не значитя.
Mint вроде как растёт из Debian, где glibc нет уже давно, а есть EGLIBC. Пакет смотри по имени libc6.
Я на твоём месте поступил бы так, убедился, что хедера ядра от ядра, которое загружено, само ядро >= 2.6.39, и дёргал бы системный вызов напрямую, мелкий враппер/макрос, конечно, придётся написать.

Serab

Я на твоём месте поступил бы так, убедился, что хедера ядра от ядра, которое загружено, само ядро >= 2.6.39, и дёргал бы системный вызов напрямую, мелкий враппер/макрос, конечно, придётся написать.
:ooo: а нафига?

Anturag

А нафига зависеть от ядра и libc, когда легко можно зависеть только от ядра? В частности напомню, что у топик-стартера проблема возникла из-за перемены libc. Но, как и упомянул, это мой сомнительный вкус, которым делюсь, но не пропагандирую.

marat7256

main.cpp:10:14: error: 'syncfs' was not declared in this scope
Если бы функция отсутствовала, компилятор бы так и написал.
Тут что-то другое, типа "use std;", но я не уверен.

Serab

o_O

Serab

Ну если так смотреть, то да, но это волевое решение. Раньше зависели только от libc, теперь будем только от ядра.

Anturag

Раньше зависели только от libc
Вероятно, я употребляю отношение «зависеть» слишком общо, так что зависимости только от libc (опять-таки от какой из N существующих? будем ли добавлять зависимость сборки libc от ядерных хедеров?) я не наблюдаю ни в ретроспективе, ни в перспективе. В границах рассматриваемого примера тоже зависимости только от libc нет, так как очевидно, что код топик-стартера в окружении linux-2.6.38/libc-2.14 работать не будет.

Serab

будем ли добавлять зависимость сборки libc от ядерных хедеров?)
я рассматриваю не с той точки зрения, что от чего на самом деле зависит, а просто: пользуемся только libc'шными хедерами, там функция есть, значит все будет ок, а что ей там дальше надо — проблема админа конкретной системы, с точки зрения написания проги проще вроде бы.

Anturag

Продолжу занудствовать IMHO.
пользуемся только libc'шными хедерами
В реальной жизни неосуществимо, libc'шные хедера зависят от ядерных. Причём есть билд-зависимость у самой libc при постройке и, независимая от этой, наследованная билд-зависимость у компилируемых программ.
там функция есть, значит все будет ок
Выше привёл пример, где будет не ок, linux-2.6.38/libc-2.14/syncfs.
что ей там дальше надо — проблема админа конкретной системы
Наоборот же, инженеры как более высокоинтеллектуальные существа диктуют админам то, что им требуется предоставить для работы.
с точки зрения написания проги проще вроде бы
Ну, только на самых простых примерах типа hello world и около, то есть прикладном ПО, в системном ПО всё несколько сложнее.

apl13

Вероятно, я употребляю отношение «зависеть» слишком общо, так что зависимости только от libc (опять-таки от какой из N существующих? будем ли добавлять зависимость сборки libc от ядерных хедеров?) я не наблюдаю ни в ретроспективе, ни в перспективе.
Скажем так, большинство менеджеров пакетов организованы так, что нужная тебе версия libc влечет нужную тебе версию ядра. Поэтому можно положиться только на зависимость от libc, надеясь, что она сделает все остальное.
Прямой зависимости от ядра у тебя не будет, только опосредованная.

Serab

В реальной жизни неосуществимо, libc'шные хедера зависят от ядерных.
это не логическая зависимость, на нее при написании кода можно положить, это все детали реализации. Я пользуюсь libc => мне пофигу, как оно реализовано: стандартная абстракция интерфейса и реализации.
Причём есть билд-зависимость у самой libc при постройке и, независимая от этой, наследованная билд-зависимость у компилируемых программ.
Это все административные вопросы, это все есть и как раз чтобы не морочить себе этим голову, проще зависеть напрямую только от libc. Ты же при написании printf не задумываешься каждый раз, как компилятор этот символ запишет в Undefined, линковщик потом найдет, разрулит, прилинкует, как потом ldd это все подцепит при запуске и т.д. Ибо мы это все знаем, но думать об этом каждый раз не хотим.
Просто ты привык работать на том уровне, где удобно завязываться на ядро, а я бы не стал менять все из-за одной функции, которая и так есть в libc, не вижу смысла вообще в этом.

vall

man 2 syscall
Оставить комментарий
Имя или ник:
Комментарий: