Главная » Архив материалов
Во-первых, процессу приходится постоянно выполнятьоперации ввода-вывода в каком-то произвольном порядке, ожидая, когда егооткрытые дескрипторы файла будут готовы для ввода-вывода. Это плохая конструкцияпрограммы. Во-вторых, было бы намного эффективнее, если бы программамогла засыпать, освобождая процессор для других задач, и просыпаться,только когда один или несколько файловых дескрипторов становятся доступнымидля ввода-вывода.1 Термин ?главный цикл? (mainloop) должен быть знаком любому, кому приходилось писатьG UI-приложения. Например, приложения GNOME используют главный цикл, предоставляемыйGLib — их базовой библиотекой. Главный цикл позволяет отслеживатьи отвечать на несколько событий из одной точки блокировки.Познакомьтесь с мультиплексированным вводом-выводом.Мультиплексированный ввод-вывод (multiplexed I/O) позволяет приложениюодновременно фиксироваться на нескольких файловых дескрипторах и получатьуведомления, когда один из них становится доступным для чтения илизаписи без ... Читать дальше »
Просмотров: 442 | Добавил: admin | Дата: 28.03.2016 | Комментарии (0)

В приложениях часто возникает необходимость фиксироваться на несколькихфайловых дескрипторах, жонглируя вводом-выводом между клавиатурой (входstdm), взаимодействием процессов и несколькими файлами. Современные основанныена событиях приложения с графическим интерфейсом пользователя(graphical user interface, G U I) могут сражаться в своих главных циклах1 буквальнос сотнями ожидающих обработки событий.Без помощи потоков выполнения, которые фактически обслуживают каждыйдескриптор файла отдельно, один процесс не мог бы разумно справляться сфиксацией более чем на одном файловом дескрипторе одновременно. Работатьс несколькими дескрипторами просто, если они всегда готовы к операции чтенияили записи. Но как только встречается дескриптор файла, который еще невозможноиспользовать, — предположим, выполняется системный вызов read(),а данных для считывания еще нет, — процесс блокируется и не может обслужитьдругие файловые дескрипторы. Блокировка может продолжаться несколькосекунд, делая ... Читать дальше »
Просмотров: 453 | Добавил: admin | Дата: 28.03.2016 | Комментарии (0)

Системный вызов se le c t () предоставляет механизм для реализации синхронногомультиплексированного ввода-вывода:finclude <sys/time.h>#include <sys/types.h>finclude <unistd.h>int select (int n,fd s e t *readfds,fd s e t *writefds.fd set *exceptfds,struct timeval *timeout):FD_CLR(int fd, fd set *set):FD_ISSET(int fd. fd s e t *set);FD_SET(int fd. fd set *set);FD_ZERO(fd_set *set);Вызов se le c tO блокируется до тех пор, пока указанный дескриптор файлане становится готовым к выполнению ввода-вывода, или же до тех пор, пока неистекает необязательный интервал тайм-аута.Наблюдаемые файловые дескрипторы разбиваются на три набора, в каждомиз которых ожидается свое событие. Дескрипторы файла в наборе readfds наблюдаютсяв ожидании момента, когда данные станут доступными для чтения(то есть можно будет выполнить операцию считывания без блокировки). Дескрипторы файла в наборе writefds наблюдаются в ожидании момента, когдаможно будет завершить без блокировки операцию записи. Након ... Читать дальше »
Просмотров: 536 | Добавил: admin | Дата: 28.03.2016 | Комментарии (0)

Максимальное значение позиции в файле ограничивается размером типа o f f t.Большинство машинных архитектур определяют его как тип С long, размер которогов Linux всегда равен одному слову (обычно это размер регистров общегоназначения машины). Внутри, однако, ядро хранит смещения, используя тип Сlong. Это не создает никаких проблем на 64-разрядных машинах, но означает,что на 32-разрядных машинах при выполнении относительных операций поискамогут возникать ошибки E0VERFL0W.Значения ошибокВ случае успеха оба вызова возвращают число считанных или записанных байтов.Если pread() возвращает значение 0, то это указывает на условие EOF; еслиpwriteO возвращает значение 0, то этот вызов ничего не записал в файл. В случаеошибки оба вызова возвращают значение -1 и соответствующим образомустанавливают переменную еггпо. Вызов preadO может устанавливать любыезначения еггпо, допустимые для вызовов read() и lseekO. Вызов pwr ite( ) можетустанавливать любые значения, допустимые для wr ite ( ) и lseekO.Усеч ... Читать дальше »
Просмотров: 364 | Добавил: admin | Дата: 28.03.2016 | Комментарии (0)

Вместо вызова 1 seek ( ) можно использовать два существующих в Linux вариантасистемных вызовов — readO и wn teO, принимающих в качестве одного изпараметров позицию в файле, с которой должны начинаться чтение или запись.После завершения работы они не обновляют позицию в файле.Вариант вызова read() называется preadO:#define XOPENSOURCE 500#include <unistd.h>ssize t pread (int fd. void *buf, s iz e t count, off t pos);Этот вызов считывает из файла, переданного при помощи дескриптора файлаfd, до count байтов в буфер buf, начиная с позиции в файле pos.Вариант вызова w r ite ( ) называется pwriteO:#define _X0PEN_S0URCE 500#include <unistd.h>ssize t pwrite (int fd, const void *buf. size t count, off t pos):Этот вызов записывает в файл, переданный при помощи дескриптора файлаfd, до count байтов из буфера buf, начиная с позиции в файле pos.Поведение этих вызовов практически идентично их собратьям без буквы рв начале названия, за исключением того, что они полностью игнорируют т ... Читать дальше »
Просмотров: 427 | Добавил: admin | Дата: 28.03.2016 | Комментарии (0)

В стандарте POSIX определяются еще два флага системного орепО, связанныес синхронизированным вводом-выводом: 0 DSYNC и 0 RSYNC. В Linux эти флагисчитаются синонимами 0 SYNC и предоставляют в точности ту же функциональность.Флаг 0 DSYNC указывает, что после каждой операции записи должны синхронизироватьсятолько обычные данные, но не метаданные. Это можно представлятьсебе как неявное выполнение после каждого запроса на запись вызоваfdatasyncO. Так как 0 SYNC обеспечивает более надежные гарантии, отсутствиеявной поддержки 0 DSYNC не приводит ни к каким потерям; единственное, чтовозможно небольшое падение производительности из-за более серьезных требований,предъявляемых 0 SYNC.Флаг 0 RSYNC включает синхронизацию не только запросов на запись, нои запросов на чтение. Его необходимо использовать вместе с одним из другихфлагов — 0 SYNC или 0 DSYNC. Как я уже сказал выше, операции считывания всегдасинхронизируются, — в конце концов, они не могут возвращать значение дотех пор, пока у ... Читать дальше »
Просмотров: 394 | Добавил: admin | Дата: 28.03.2016 | Комментарии (0)

Обычно ввод-вывод выполняется в файле линейно, и все действия поиска, в которыхвозникает необходимость, относятся только к неявному обновлению позициив файле после операций считывания и записи. Некоторым приложениям,однако, приходится перемещаться по файлу. Системный вызов lseekO предназначендля установки позиции в файле, соответствующем файловому дескриптору.Помимо обновления позиции в файле, он больше ничего не делает и вообщеникакие действия ввода-вывода не инициирует:finclude <sys/types.h>finclude <unistd.h>off t lseek (int fd. off t pos, int origin);Поведение lseekO зависит от аргумента origin, который может приниматьследующие значения:SEEKCURТекущая позиция в файле fd увеличивается на значение аргумента pos, которыйможет содержать отрицательное, положительное и пулевое значение.Если pos равен нулю, то возвращается значение текущей позиции в файле.SEEKENDВ качестве текущей позиции в файле fd устанавливается значение, равноетекущей длине файла плюс значение pos. Аргумен ... Читать дальше »
Просмотров: 402 | Добавил: admin | Дата: 28.03.2016 | Комментарии (0)

Ядро Linux, как и ядро любой другой современной операционной системы, реализуетсложный пласт возможностей кэширования, буферизации и управлениявводом-выводом между устройствами и приложением (см. раздел ?Внутреннееустройство ядра? в конце этой главы). Когда речь идет о быстродействующихприложениях, часто возникает желание обойти этот уровень сложности и реализоватьсобственные функции управления вводом-выводом.Однако развертывание собственной системы ввода-вывода обычно не стоитзатрачиваемых усилий, и в действительности инструменты, доступные на уровнеоперационной системы, скорее всего, позволят добиться намного более высокойпроизводительности, чем средства уровня приложений. И все же системыуправления базами данных зачастую используют собственные функции кэширования,чтобы минимизировать присутствие в них операционной системы, кактолько это возможно.Когда вы добавляете флаг 0 DIRECT в вызов орепО, ядро минимизируетуправление вводом-выводом и ввод-вывод осуществляется напрямую из буферов ... Читать дальше »
Просмотров: 481 | Добавил: admin | Дата: 28.03.2016 | Комментарии (0)

После того как работа с дескриптором файла в программе завершена, можноудалить связь между дескриптором и соответствующим файлом, применив системныйвызов closeO:finclude <unistd.h>int close (int fd);Когда closeO срабатывает, проецирование открытого дескриптора файла fdна сам файл прекращается и процесс отсоединяется от файла. Данный файловыйдескриптор больше не является допустимым, и ядро может повторно использоватьего в качестве возвращаемого значения для последующих вызововореп() и creatO. Вызов closeC) в случае успеха возвращает значение 0. В случаеошибки он возвращает -1 и соответствующим образом устанавливает переменнуюеггпо. Применять его просто:if (close (fd)
Просмотров: 472 | Добавил: admin | Дата: 28.03.2016 | Комментарии (0)

Команда ThinkGeek разработала новый "старый" телефон. Они предлагают уставшим от современного дизайна пользователям мобильных телефонов новый девайс - телефонную трубку, которая по Bluetooth соединяется с сотовым. Теперь вы можете говорить по стильной старинной трубке, какой бы телефон не лежал бы у вас в кармане. Но будьте осторожны - человек, говорящий в ни с чем не соединенную телефонную трубку, может выглядеть как сумасшедший! Продается этот забавный гаджет только на сайте ThinkGeek (можно приобрести тут) всего за сумму около 30$. Однако русские покупатели будут вынуждены оплатить еще и доставку в Россию. Заряжается аппарат от USB, работает приблизительно на расстоянии 9 метров от телефона, поддерживает стандарты Bluetooth V1.0, 1.1, 1.2.
Просмотров: 376 | Добавил: admin | Дата: 28.03.2016 | Комментарии (0)

« 1 2 ... 6 7 8 9 10 ... 17 18 »