Почему некоторые системные вызовы 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(). Они действительно не являются частью ядра, и их доступность действительно зависит от системных библиотек.   -  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, я не ожидаю, что ОП должен быть полностью обновлен в отношении того, когда определенные функции были добавлены в Glibc, но поскольку документация, которую они сами представили, кажется, противоречит заявлениям, которые они делают, я считаю это разумным просить разъяснения того, что они хотят знать.   -  person John Bollinger    schedule 31.08.2019


Ответы (1)


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

Как указано на странице руководства:

ПРИМЕЧАНИЯ
Glibc не предоставляет оболочки для этого системного вызова; вызовите его с помощью системного вызова (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;
}

Как видите, это тот же прототип, который описан на странице руководства. Прототип на странице руководства предназначен только для справки, поэтому вы можете создать оболочку вокруг системного вызова, если вы (или разработчики libc) того пожелаете.

Если вы только начинаете изучать C, я предлагаю вам прекратить попытки понять системные вызовы и их оболочки в библиотеке C, пока вы не приобретете больше опыта в этом языке. Тогда будет понятна разница.

person S.S. Anne    schedule 31.08.2019
comment
Этот системный вызов действительно имеет оболочку в достаточно новом Glibc, как действительно указывает онлайн-справочная страница, на которую ссылается OP. Судя по комментариям, часть их путаницы связана с разницей между системными вызовами в смысле интерфейса ядра и системными вызовами в смысле функции-оболочки, а также тем, кто несет ответственность за обеспечение последнего. - person John Bollinger; 31.08.2019
comment
@JohnBollinger О чем я рассказал в своем ответе на другой вопрос ОП. См. редактирование. - person S.S. Anne; 31.08.2019