Показаны сообщения с ярлыком C. Показать все сообщения
Показаны сообщения с ярлыком C. Показать все сообщения

01 июля, 2008

Стандарты и концепты системного програмирования в UNIX

Определение понятий - это начало ссылок.
Сократ

Ключевые моменты в современном UNIX программировании:
системные вызовы (syscalls), библиотека C (glibc), коллекция компиляторов (gcc), программные интерфейсы (APIs), бинарные интерфейсы (ABIs), ..[добавить нужное]

== стандарты: POSIX, SUS, C ==

UNIX стандарты.

Системное программирование в UNIX - древнее искусство. За 39 лет здесь не обошлось без хаоса и UNIX войн(расхождение линий AT&T и Berkley University в 1979, лишение прав компании Bell в 1984). Чтобы предотвратить хаос, группы выявления стандартов описали системные интерфейсы в официальных стандартах.
POSIX и SUS являются стандартами C API интерфейсов UNIX-подобных ОС.
В 1985 группа IEEE начала работать над стандартизацией интерфейсов системного уровня UNIX систем. Ричард Столлман (RMS) предложил название для даного стандарта: POSIX [произношение pahz-icks, как позитив]. Первый вариант POSIX появился в 1988: IEEE Std 1003.1-1998. (ISO, IEC приняли эти стандарты как ISO/IEC 9945). Версии стандартов описаны здесь.
The Open Group (объединение X/Open и OSF) также принимали участие в разработке стандартов для UNIX. Их главный труд Single UNIX Specification (SUS) (1994). Сегодня SUSv3(UNIX 03, 2002) включен в POSIX (IEEE Std 1003.1-2001).

C стандарты.

История раннего С описана в статье Д. М. Ритчи "The Development of the C Language, 1993".
Опубликованная впервые в 1978 году книга Денниса Ритчи и Брайана Кернигана "The C Programming Language" ("белая книга") стала неформальным стандартом языка, известным как K&R C, или classic C (классический С). В 1983 году ANSI сформировал комитет (X3J11), целью которого была разработка стандарта официальной версии C (хотя реализация С для UNIX скорее становится стандартом де-факто) и включить некоторые особенности из нового языка C++. Процесс был длительным, стандарт был принят в 1989 году. В 1990 ISO приняло стандарт, основанный на ANSI C, с мелкими модификациями (добавлены литеры signed, void). В 1999 году ISO представило новый стандарт на C (ISO C99), в который были добавлены новые возможности: inline функции, типы (_Bool, _Complex, _Imaginary), комментарии в стиле C++, новые библиотеки функций.


== концепты: файлы, процессы, сигналы, IPC ==

Файлы

еще о файлах (начало здесь; ls([2,3]), stat.h)
..прежде чем получить доступ к файлу для чтения, записи, обработки или др. он должен быть открыт. Открытый файл указывается через уникальный дескриптор, соответствующий метаданным, ассоциированным с самим файлом. Этот дескриптор обрабатывается целым числом (тип int в C) называемым дескриптором файла(file descriptor, fd). fd разделены с пространством пользователя (user space), и используются пользовательскими программами напрямую для доступа к файлу.
Длина файлов ограничена (и только) размерами типов C (C types). Однако файловые системы(FS) могут накладывать свои ограничения, например, укрощать максимальную длину.
Один файл может быть открыт не один раз, причем даже тем же процессом. Каждому открытому экземпляру файла присваивается уникальный дескриптор (файловый дескриптор). Процессы могут совместно использовать fd, позволяя единственному дескриптору использоваться более чем одним процессом.
inode (information node) включает в себя метаданные ассоциированные с файлом, включая местоположение данных файла.
C точки зрения безопасности доступ к файлу через inode обременителен, поэтому файлы обычно открывают из пространства пользователя (user space) по имени (не по номеру inode!). Имя (в человеко-читаемой форме) и inode файла образуют пару, называемую ссылкой (link).
Когда ядро обращается к файлу оно проходит каждое вхождение директории (directory entry, dentry), начиная с /, то есть (для /home/va1e/unix.prog.01.st) сначала получает inode директории home, входит сюда, получает inode va1e, входит сюда, и, наконец, получает inode unix.prog.01.st. Эта операция называется развязкой пути (directory resolution). Для хранения результатов развязки (dir resolution) ядро использует кэш вхождений (dentry cache). Это позволяет быстро обращаться к файлам в будущем. Хотя и директории обрабатываются как обычные файлы, они должны управляться специальным набором системных вызовов.
Специальные файлы - это объекты ядра. И они являются файлами в соответствии парадигмы "всё - файл". Специальными файлами могут быть: файлы UNIX устройств (блочных устройств, символьных устройств [каждое устройство имеет свой файл]), именованные каналы (FIFO, механизм межпроцессорного взаимодействия [IPC]), UNIX сокеты (в отличие от IPC, сокеты позволяют взаимодействовать двум различным процессам не только на одной машине). Как и обычные файлы, специальные создаются путем системных вызовов.

Процессы

Следующим за файлами по значимости в UNIX идут процессы.
Процесс - это запущенный объектный код. Пример: запущенная в своем адресном пространстве программа. Процесс начинает свою жизнь с запуска объектного кода в исполняемом формате, который содержит метаданные, куски кода, загружаемые в память(например, инициализированные переменные С) и данные. Процесс также связан с системными ресурсами(аппаратное обеспечение, сетевые соединения, таймеры, сигналы, открытые файлы, механизмы межпроцессорного взаимодействия), которые управляются ядром; процесс работает с ресурсами только через системные вызовы. Ресурсы, их данные, записываются в дескриптор процесса внутри ядра.
Каждый процесс состоит из одной или нескольких нитей (threads), или единицы активности в процессе, которая отвечает за состояние процесса. Нить состоит из стэка (структуры данных), состояния процессора, и текущего размещения в объектном коде.
Каждый процесс обозначется уникальным целым числом - идентификатором процессы (process ID, PID) [ps(1)]. Дерево процессов(process tree) начинается с первого процесса init(8) [man 8 init]. Новый процесс создается системным вызовом fork(), который создает копию вызываемого процесса. Оригинальный процесс называется родительским (parent), новый - наследованным (child).

Сигналы

Сигналы (Signals) - это механизм односторонней передачи асинхронных сообщений. Сигнал может быть послан от ядра к процессу, от одного процесса другому. Обычно сигнал сообщает процессу о событии, например, аварийное завершение, или нажатие пользователем клавиш C-c. Число сигналов ограничено архитектурой. Каждый из них представлен числовой константой и именем. Например, SIGHUP (signal hangup) имеет значение 1 на x86 архитектуре.

IPC

Одной из важнейших работ ОС является возможность обмена информацией между процессами и предупреждение их о различных событиях(IPC). Многие механазмы IPC описаны в UNIX стандартах, указанных выше.


Список литературы:
1. SUSv3 [http://www.unix.org/version3/]
2. Стивен Прата. Язык программирования С. Лекции и упражнения. 2006, Вильямс
3. D. Lewine. POSIX Programmer's Guide: Writing Portable UNIX Programs. 1992, O'Reilly & Associates
4. R. Love. Linux System Pogramming. 2007, O'Reilly.

22 июля, 2007

KLone: каркас для web-программирования на языке C.

KLone - это фреймворк для программирования веб-приложений, который расширяет простой HTML языком С, и помещает весь код на сервере в один бинарный файл.

.deb пакет
KLone доступен в Debian GNU/Linux 4.0 "Etch" и Ubuntu Linux "Edgy", "Feisty Fawn", "Gutsy Gibbon".
~$ apt-get install klone-package


PHP очень популярен своим стилем программирования, смешиванием HTML с исходным кодом, заключенным в теги <?php ... ?>. Существует множество инструментов и каркасов для веб-программирования на других языках, таких как Perl и Python, совершенно удивительный выбор языка программирования, который вы можете использовать взамен вышеперечисленных, называется C.

Посмотрим на пример как создать простое веб-приложение.

Создадим директорию, в которой будем работать.
~$ make-klone-project create -p myhello
~$ cd myhello-0.1

В директории проекта будет храниться несколько файлов и директорий . Одна из важнейших папок будет Debian/, в которой будут храниться файлы для генерации .deb пакета, содержащего веб-аппликацию. К этому вернемся чуть позже. Сейчас же давайте сосредоточимся на другой интересной директории userdata/.
~$ cd userdata
~$ mkdir etc
~$ cd etc

Создаем файл kloned.conf и редактируем его.
~$ nano kloned.conf



server_list my_http
allow_root yes

my_http
{
type http
addr.type IPv4
addr.port 8880
dir_root /www
}


Теперь мы готовы приступить к созданию непосредственно нашего приложения.

$ cd ..
$ mkdir www
$ cd www


Создаем и редактируем файл index.kl1. Любой файл с расширением .kl1 будет относиться к HTML/C приложениям.

~$ nano index.kl1


<%!
#include
time_t now;
%>
<html>
<head><title>Hello World</title></head>
<body>
<h1>Hello World</h1>
<br>
<%
now = time(0);
io_printf(out, "Time is now %sn", ctime(&now));
%>
</body>
</html>

Теперь вернемся к корневой директории проекта и создадим kloned сервер:

~$ kloned-build -o myapp userdata
~$ ./myapp -F

Сервер не запускается как демон, поэтому пользуем параметр -F. Теперь Вы можете посмотреть веб-аппликацию с помощью браузера @ http://localhost:8880/. Вы увидите текущую дату :) Это еще не все. Остановите аппликацию, которую Вы только то запустили, запустите ~$ apt-get install dpkg-dev, далее:


~$ dpkg-buildpackage -rfakeroot
~$ sudo dpkg -i ../myhello_0.1*deb

Вы только что установили .deb пакет, который содержит веб-аппликацию =)

Еще примеры

Если Вы хотитет увидеть больше примеров использования KLone'а, посетите сайт KoanLogic'а.