Аналог winapi в linux

Обновлено: 05.07.2024

Я перехожу от программирования Windows (Под программированием Windows я имею в виду использование Windows API Программирование в Linux.

Для программирования Windows у нас есть вариант Win32API (MFC - просто оболочка C++ для того же).

Я хочу знать, есть ли что-то вроде Linux API (эквивалентный WINAPI), который предоставляется непосредственно программисту? Где я могу найти ссылку?

С моим небольшим знанием библиотеки POSIX я вижу, что она охватывает часть Linux API , Но как насчет создания приложений с графическим интерфейсом? POSIX не предлагает этого. Я знаю, что есть множество сторонних наборов инструментов Widget, таких как gtk, Qt и т. Д. Но я не хочу использовать библиотеки, которые инкапсулируют Linux API. Я хочу научиться использовать "Core Linux API".

Если есть что-то, что я должен знать, пожалуйста, сообщите. Любой программист, который знаком как с программированием для Windows, так и для Linux, пожалуйста, нанесите на карту терминологию мира Linux, чтобы я мог быстро двигаться дальше.

Любые ресурсы (книги, учебные пособия,ссылки) высоко ценятся.

Я думаю, что вы ищете что-то, чего точно не существует. В отличие от Win32 API, нет "Linux API" для создания приложений с графическим интерфейсом. Самое близкое, что вы можете получить, - это сам протокол X, который представляет собой довольно низкоуровневый способ создания GUI (он гораздо более детальный и архаичный, чем Win32 GDI, например). Вот почему существуют такие обертки, как GTK и Qt, которые скрывают детали протокола X.

Протокол X доступен для программ на C, использующих XLib.

То, что вы должны понять, это то, что Linux очень огорчен тем, что в нем содержится. "Core" Linux API - это POSIX и glibc. Linux НЕ является графическим по умолчанию, поэтому нет графической библиотеки ядра. Действительно, Windows может быть урезана, чтобы не иметь графики и, следовательно, не иметь таких частей Win32 API, как GDI. Это вы должны понимать. Linux очень легкий по сравнению с Windows.

Для Linux есть два основных графических инструментария, GTK и Qt. Я сам предпочитаю GTK, но я бы исследовал оба. Также обратите внимание, что GTK и Qt существуют для Windows, потому что они просто оболочки. Если вы идете, посмотрите на код протокола X, скажем, xterm вы поймете, почему никто не пытается на самом деле создавать графические приложения поверх него.

О, также SDL довольно хорош, он довольно прост, но хорошо, если вам просто нужен кадровый буфер для окна. Он переносим между Linux и Windows и очень прост в освоении. Но это будет только растянуть пока..

Linux и win не так отличаются, как кажется.

В обеих системах существует ядро, которое не является графическим.

Просто Microsoft не документирует это ядро ​​и публикует API, который ссылается на различные компоненты.

В Unix это более прозрачно. Там действительно (не GUI) API ядра, и он опубликован. Затем существуют службы, которые работают поверх этого, по желанию, и их интерфейсы публикуются без попытки объединить их в воображаемый слой, который на самом деле не существует.

Итак, самый низкий уровень графического интерфейса - это система X Window, и она имеет библиотеку самого низкого уровня под названием Xlib. Как вы уже заметили, поверх этой библиотеки работают различные библиотеки.

Я бы настоятельно рекомендовал взглянуть на инфраструктуру пользовательского интерфейса QT/C++, это, пожалуй, самый полный набор инструментов для любой платформы.

Мы используем его при разработке кроссплатформенных приложений для Windows, OSX и Linux.

Он также работает на операционной системе смартфона Nokia Maemo, которая недавно была объединена с операционной системой Intel Moblin Linux, которая теперь называется MeeGo.

Я не хочу знать, существует ли взаимно однозначная эквивалентность между функциями API в windows и linux, и не нужно знать каждую функцию API.

Я просто хочу знать это для двух основных вещей:

  • Я хочу понять, почему платформа Qt независима.
  • Я хочу знать, какой API я должен использовать в linux для переноса приложения, запрограммированного с помощью API Win32, или, другими словами, на уровне API Win32.

Я знаю, что это не практично, но я хочу знать эту эквивалентность.

Вам нужно понять, что syscalls. В Linux они являются наименьшим возможным user API земли (в отличие от API Win32, возможно, смешивает реальные системные вызовы ядра с некоторыми функциями библиотек. libc также делает такой микс в Linux). fork (2), execve (2), open (2), pipe (2), mmap (2), прочитать (2), опрос (2), закрыть (2), dup2 (2), sigaction (2) являются важные системные вызовы (но их около 300).

Не ожидайте, что все функции Windows будут доступны в Linux (и наоборот). Даже не думайте о таком эквиваленте. Получите другое мышление в Linux. (В частности, процессы сильно отличаются в Linux и Windows).

Не забывайте, что Linux - это бесплатное программное обеспечение, и вы можете погрузиться в исходный код каждой функции, которую вы используете в Linux. Прочтите его, найдите его, улучшите его.

Некоторые библиотеки пытаются разложить и обеспечить общую абстракцию как для Posix (например, для Linux), так и для Windows. В частности, Qt (а также Gtk).

Если вас интересует графический интерфейс, понимайте важную роль X11 (обратите внимание, что сервер X11 находится ближе всего к экрану и клавиатура, большинство графических приложений - клиенты X11). В 2016 году X11, как правило, заменяется на Wayland (но вы не заметите, что реализация "детализация" - действительно важная - если вы кодируете Qt или GTK)

Если вы пишете приложение, использующее только Qt-вызовы (те, которые не задокументированы как специфичные для Linux или Windows) в дополнение к стандартным функциям С++, оно должно быть источником, переносимым с Linux на Windows и наоборот.



Подскажите аналог windows evnt в линукс. Пока пользуюсь семафорами, но неудобно, т.к. sem_post лишь увеличивает семафор на единицу, а мне нужно, что бы он был разблокирован все время, и блокировать его лишь в нужных случаях. Как в виндоус, эвенты очень удобны для этих целей, но в линуксе что-то не найду аналога





Сигналы пробовал, но подумал, может есть аналог именно эвентов.
Можно конечно в сигнало изменять флаг в нужное время, который проверяют потоки, но хотелось сделать элегантней. Что бы поток работал и останавливался именно тогда когда мне нужно, без лишней возни с сигналами.





А чем это поможет, это ведь по сути тот же симафор, как критическая секция в виндоуз.

У меня несколько потоков работают в цикле и взаимодействуют между собой, у них свой механизм синхронизации с семафорами. Но есть один общий, который останавливает систему, если в одном из потоков произошел сбой. Система останавливается, пока в другом потоке не будет решена данная ситуация. За неимением эвентов я уже пользуюсь сейчас семафорами и сигналами.
Насколько я понял, аналога эвентов нет?



не совсем понял, как бы ты задачу решил через event виндовый, но может те нужен аналог WaitForSingleObject?
може поможет pthread_mutex_timedlock_np



Да я им и пользовался WaitForSingleObject

pthread_mutex_timedlock_np разве не временная блокировка?

Добавлено 30.06.08, 17:56
Да я им и пользовался WaitForSingleObject

pthread_mutex_timedlock_np разве не временная блокировка?

просто я сейчас извращаюсь используя блокировку разблокировку по флагу в отдельно функции, что бы добиться эффекта WaitForSingleObject. Т.к. мне нужно, что бы потоки засыпали в нужное время. Ну если нет альтернативы, значит, буду просто совершенствовать свой механизм.

Спасибо большое всем за советы.



pthread_mutex_timedlock_np разве не временная блокировка? If the mutex is currently locked by another thread, the call to pthread_mutex_timedlock_np() will block until the specified delta time has elapsed or the holding thread relinquishes ownership via a call to pthread_mutex_unlock().



pthread_mutex_timedlock_np разве не временная блокировка? If the mutex is currently locked by another thread, the call to pthread_mutex_timedlock_np() will block until the specified delta time has elapsed or the holding thread relinquishes ownership via a call to pthread_mutex_unlock().
Да, все так, но там ведь нет флага INFINITE, поэтому время ограниченно, а система должна работать без ограничений, и соответственно ждать без ограничений если нужно. Т.к. проблема дедлока решается через другой механизм.



Да, все так, но там ведь нет флага INFINITE, поэтому время ограниченно, а система должна работать без ограничений, и соответственно ждать без ограничений если нужно.
как ты думаешь: если в tv_sec загнать -1?
INFINITE в signed это -1, и если подождать >3 лет, то может это и не INFINITE?



Да, все так, но там ведь нет флага INFINITE, поэтому время ограниченно, а система должна работать без ограничений, и соответственно ждать без ограничений если нужно.
как ты думаешь: если в tv_sec загнать -1?
INFINITE в signed это -1, и если подождать >3 лет, то может это и не INFINITE?



alMuk, классическая реализация аналога виндовых эвентов на POSIX Threads - это conditional variable + mutex. Т. е. ты заводишь себе булевский флажок (символизирующий эвент), и conditional variable к нему, естественно, вместе с мутексом. Ожидающие потоки в нужный момент входят в состояние ожидания изменения этого флага (синхронизированно через mutex), а инициирующий поток, изменив значение флага, дает команду всем разблокироваться.

Добавлено 30.06.08, 18:44
Код на память не воспроизведу, но смысл именно такой.





вот вернулся опять к линуксовской версии своей программой и опять возникли те-же проблемы.

допустим я использую переменную состояния, но проблема в том, что поток работает в цикле, и должен работать столько сколько нужно, пока его не заблокирует другой поток.

при использовании pthread_cond_wait в цикле, разблокировавшись один раз, поток при следующем разе снова блокируется и нужно снова вызывать pthread_cond_broadcast или pthread_cond_signal.

Вот примитивный пример:
объясните пожалуста на пальцах, как мне сделать что бы поток не блокировался до тех пор, пока не будет надобности. В данном случае пока не будет нажата клавиша.
В данном прмере цикл в функции SignalGenerator срабатывает один раз и переходит в состояние ожидания. А мне нужно, что-бы этот цикл крутился до тех пор пока не будет вызвана функция pthread_cond_signal

Т.н. в виндовс API WaitForSingleObject просо проверяет состояние эвента и все, состояние эвента она не меняет, мне очень нужн такой-же механизм.

Чистый Win32 API (pure Win32 API)

Компоненты пользовательского интерфейса

Утилиты для исследования Windows

Отладка в Linux

Многие старые функции CRT имеют новые, более безопасные версии. Если безопасная функция существует, то старая менее безопасная версия помечена как нерекомендуемая (deprecated), а новая версия имеет суффикс _s ("secure" - "безопасный"). Пример: функция printf() заменяется более безопасной функцией printf_s() и так далее.

История GUI SAP

GDI (Graphics Device Interface)

Когда приложениям требовалась поддержка как Windows NT, так и Windows 95, Windows 98 и Windows Me, было полезно скомпилировать один и тот же код для строк ANSI или Unicode, в зависимости от целевой платформы. С этой целью Windows SDK предоставляет макросы, которые отображают строки в Unicode или ANSI, в зависимости от платформы.

Макрос Тип в кодировке Unicode (utf-8) Тип в кодировке ANSI Файл определения макроса
TCHAR wchar_t char windows.h
TEXT("x") L"x" "x" windows.h
_TCHAR wchar_t char tchar.h
_T("x") L"x" "x" tchar.h

Если приложение необходимо скомпилировать для поддержки строк Unicode, необходимо определить символы препроцессора в коде программы (допускается макроопределения указывать при компиляции программы)

После этого определённые в заголовках библиотек Windows SDK и Microsoft C будут переключены на функции с поддержкой юникода, примерно следующим образом

Макрос _UNICODE используется в заголовочных файлах библиотеки С, а макрос UNICODE - в заголовочных файлах библиотеки Windows SDK.

  • Функция SetWindowTextA() поддерживает строки в кодировке ANSI.
  • Функция SetWindowTextW() поддерживает строки в кодировке Unicode.

Компилятор Visual C++ поддерживает char и wchar_t как встроенные типы данных для кодировок ANSI и Unicode.
Чтобы объявить литерал широких символов (для хранения символа используется более 1 байта, то есть кодировка Unicode) или строковый литерал широких символов, необходимо поставить L перед литералом

Утилита gcc это коллекция компиляторов C, C++, Objective-C, Fortran , Ada, Go и D.
Файлы с расширением *.c компилируются как язык C.
Файлы с расширением *.cc и *.cpp компилируются как язык C++.

Стандарты компилятора C и C++ отличаются, например представление литералов

Компиляция указанного кода в файлах с разным расширением даст отличающиеся результаты:

Читайте также: