Зависит ли реализация библиотек C от ОС?
Мне просто интересно, что в разных ОС существуют разные функции, но они служат одной и той же цели, или можно сказать, что разные ОС имеют разные языки системного программирования (например, Windows и UNIX).
Так, например, поскольку библиотека C состоит из реализации функций, их реализация должна вызывать различные функции (в зависимости от ОС), чтобы реализовать одно и то же. Это правильно? Итак, используются ли библиотеки в cygwin для компиляции программы на C, специально написанной для Windows, и библиотеки gcc, особенно для Linux? Я прав? Если нет, то почему?
4 ответа
Да, это правильно. Разные ОС имеют разные функции, которые делают одно и то же. Например, в Windows вы создаете поток, вызывая CreateThread()
пока на linux звонишь pthread_create()
,
Что касается времени выполнения C, то все ОС реализуют их, но по-разному. В Windows fopen()
это обертка, которая будет вызывать CreateFile()
в то время как на Linux fopen()
это обертка для open()
,
Cygwin и другие пользователи добавляют библиотеки для реализации функции "только для Linux" в Windows. Например, Cygwin будет реализовывать pthread_create()
в Windows, оборачивая CreateThread()
как MS сделал для fopen()
,
Да.
Чтобы добавить ответ ElderBug, библиотеки C, которые действуют как оболочки для разных типов системных вызовов, различаются в разных системах. Системные вызовы, такие как следующие (из "Операционных систем NYU", лекция № 4), переводят процесс из режима пользователя в режим супервизора / ядра.
Обратите внимание на цель провести различие между пользовательским режимом (оболочки) и режимом ядра (реализация ОС) из лекции:
Важной задачей ОС является то, что семантика вызова простых процедур соблюдается с точки зрения пользовательского процесса. Сложность скрыта в самом ядре, еще один пример операционной системы, обеспечивающей более абстрактную, т. Е. Более простую, виртуальную машину для пользовательских процессов.
Как вы знаете, эти примеры вызовов не одинаковы в разных операционных системах, таких как Windows и Linux, но имена функций-оболочек C - иначе, сам скомпилированный язык будет отличаться в разных системах.
Надеюсь, это поможет!
Имейте в виду, что есть два типа библиотечных функций: утилиты и системные оболочки. Допустим, вы продавец, который пытается создать переносимую библиотеку.
Функции утилит, такие как sprintf и atoi, будут одинаковыми в любой реализации, поскольку они не нуждаются в системных службах ОС.
Обычно в вашей библиотеке будет слой абстракции. У вас может быть такая функция
void * getBytesFromOS (unsigned int count) ;
что выделяет страницы памяти. Это будет иметь разные реализации для разных систем. Функция malloc, использующая такой интерфейс, может быть на 99% одинаковой в операционных системах.
Да, ты понял. Я мало что могу добавить.
Но, насколько я знаю, ОС обслуживает библиотеки, и они просто связаны между собой. Причина этого в том, что программисты, которые разрабатывают системные реализации, лучше всего знают свою собственную систему. Реализация fopen()
не просто просит жесткий диск переулок для его вещей. (вы, наверное, знаете)
Вы должны учитывать многие обстоятельства других реализаций, которые работают с дескрипторами файлов. И, может быть, вам нужно полагаться на то, что происходит в конкретной функции в вашей ОС, для чего не нужно поведение в целом. Но в вашей среде все это работает.
Именно поэтому стандарт C говорит, что изменение исходного кода стандартных библиотек приводит к неопределенному поведению, даже если сама функция все еще выполняет то же поведение (пытался найти ссылку для вас, но не смог, извините.)
Так что все это вещь оптимизации. Может быть общая реализация, но так как в основном вся ОС основана на тысячных реализациях, каждая ОС заинтересована в том, чтобы заставить их работать лучше для своего собственного Case.
(вероятно, не единственный, но я не настолько глубоко в разработке ОС, как я мог бы назвать другую)