Защо някои системни извиквания на Linux нямат обвивка, но са документирани така, сякаш имат?

Нека разгледаме системното извикване gettid като пример:
http://man7.org/linux/man-pages/man2/gettid.2.html

Знам, че gettid не е имплементиран в libc и трябва да направя директно системно извикване, за да го използвам (syscall(SYS_gettid)). Проверих това сам с този C код:

#include <stdio.h>
#include <sys/types.h>

int main(){

 pid_t a = gettid();
 return 0;
}

който не се свързва и дава това предупреждение при компилиране: warning: implicit declaration of function 'gettid'; did you mean 'getline'.

Сега въпросът ми е защо документацията на Linux го документира така, сякаш тази функция действително съществува?

SYNOPSIS 

   #include <sys/types.h>

       pid_t gettid(void);

Те нямат пример как да направят директно системно повикване и вместо това имат горния кодов фрагмент, който не съществува и не може да се използва. Има ли нещо, което пропускам?


person josh    schedule 31.08.2019    source източник
comment
@Scheff нищо не е счупено, това е действително нещо: ubuntuforums.org/showthread.php?t= 345317 , съществува проблем и за някои други системни извиквания.   -  person josh    schedule 31.08.2019
comment
@josh, документите, които свързвате, посочват както версията на glibc, която за първи път предостави функция за обвивка, така и механизма (syscall()), които трябваше да се използват вместо това в по-ранни версии. И така, какво точно питаш?   -  person John Bollinger    schedule 31.08.2019
comment
Така че самият linux не предоставя никакви обвивки, работата на libc е да го направи   -  person josh    schedule 31.08.2019
comment
josh Хубава работа и добър стил, приемайки моя слаб намек. Късмет.   -  person Yunnosch    schedule 31.08.2019
comment
Самият Linux е само ядрото на операционната система. Една дистрибуция на Linux комбинира това с библиотеки и помощни програми, за да създаде функционална операционна система. Обвивките на Syscall са функции, които се намират в библиотеки, както всъщност е и функцията syscall() с общо предназначение. Те наистина не са част от ядрото и кои са налични наистина зависи от системните библиотеки.   -  person John Bollinger    schedule 31.08.2019
comment
@JohnBollinger тази обвивка беше добавена към GlibC версия 2.30, публикувана на първи август тази година, само преди четири седмици, така че трябва да отпуснем малко OP тук, мисля ;-)   -  person deamentiaemundi    schedule 31.08.2019
comment
@deamentiaemundi най-накрая. Как, по дяволите, им отне толкова време да го внедрят?   -  person S.S. Anne    schedule 31.08.2019
comment
@deamentiaemundi, нямам очаквания, че OP трябва да е напълно актуална по отношение на това кога са добавени определени функции към Glibc, но доколкото документацията, която самите те представиха, изглежда противоречи на твърденията, които правят, смятам, че е разумно да поискат някакво разяснение на това, което искат да знаят.   -  person John Bollinger    schedule 31.08.2019


Отговори (1)


Syscall няма обвивка в библиотеката на GNU C (преди 2.30), това е само прототип на това как би изглеждала функцията, ако имаше.

Както е отбелязано в man страницата:

ЗАБЕЛЕЖКИ
Glibc не предоставя обвивка за това системно извикване; извикайте го с помощта на syscall(2).

Ето пример за обвивката gettid:

#define _GNU_SOURCE
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>

pid_t gettid(void)
{
    pid_t tid = (pid_t)syscall(SYS_gettid);
    return tid;
}

Както можете да видите, това е същият прототип, както е описано в man-страницата. Прототипът в man-страницата е само за справка, така че можете да създадете обвивка около системното повикване, ако вие (или разработчиците на libc) решите.

Ако тепърва започвате да изучавате C, предлагам ви да спрете да се опитвате да разберете системните извиквания и техните обвивки в C библиотеката, докато не придобиете повече опит с езика. Тогава разликата ще бъде ясна.

person S.S. Anne    schedule 31.08.2019
comment
Това системно повикване има обвивка в достатъчно нов Glibc, както наистина показва онлайн страницата за ръководство, свързана с OP. От коментарите част от тяхното объркване се върти около разликата между системните извиквания в смисъла на интерфейса на ядрото и системните извиквания в смисъла на обвиващата функция и чия е отговорността да предостави последното. - person John Bollinger; 31.08.2019
comment
@JohnBollinger Което разгледах в отговора си на другия въпрос на OP. Вижте редактиране. - person S.S. Anne; 31.08.2019