Буфер результатов слишком мал
Буфер результатов слишком мал
Когда мы рассказывали о функции door_call, мы отметили, что если буфер результатов оказывается слишком мал, библиотека дверей осуществляет автоматическое выделение нового буфера. Сейчас мы покажем это на примере. В листинге 15.4 приведен текст новой программы-клиента, которая представляет собой измененную версию листинга 15.2.
Листинг 15.4. Вывод адреса полученного результата
//doors/client2.c
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 int fd;
6 long ival, oval;
7 door_arg_t arg;
8 if (argc != 3)
9 err_quit("usage: client2 <server-pathname> <integer-value>");
10 fd = Open(argv[1], O_RDWR); /* открываем дверь */
11 /* подготовка аргументов и указателя на результат */
12 ival = atol(argv[2]);
13 arg.data_ptr = (char *) &ival; /* аргументы-данные */
14 arg.data_size = sizeof(long); /* объем данных */
15 arg.desc_ptr = NULL;
16 arg.desc_num = 0;
17 arg.rbuf = (char *) &oval; /* возвращаемые данные */
18 arg.rsize = sizeof(long); /* объем возвращаемых данных */
19 /* вызов процедуры сервера и вывод результата */
20 Door_call(fd, &arg);
21 printf("&oval = %p, data_ptr = %p, rbuf = %p, rsize = %d ",
22 &oval, arg.data_ptr, arg.rbuf, arg.rsize);
23 printf("result: %ld ", *((long *) arg.data_ptr));
24 exit(0);
25 }
19-22 В этой версии программы на экран выводится адрес переменной oval, содержимое указателя data_ptr, который должен указывать на возвращаемые функцией door_call данные, и адрес и размер приемного буфера (rbuf и rsize).
Запустим эту программу, не изменяя размер приемного буфера по сравнению с листингом 15.2. Мы ожидаем, что data_ptr и rbuf будут указывать на переменную oval и rsize будет иметь значение 4 (4 байта в буфере). И действительно, вот что мы видим:
solaris % client2 /tmp/server2 22
&oval = effff740, data_ptr = effff740, rbuf = effff740, rsize = 4
result: 484
Изменим только одну строку в листинге 15.4, уменьшив размер буфера клиента до одного байта. Новый вариант строки 18 будет иметь вид:
arg.rsize = sizeof(long) – 1; /* размер буфера данных */
Запустим новую программу и увидим, что библиотека автоматически выделила место под новый буфер результатов и data_ptr теперь указывает на новый буфер:
solaris % client3 /tmp/server3 33
&oval = effff740, data_ptr = ef620000, rbuf = ef620000, rsize = 4096
result: 1089
Размер выделенного буфера равен 4096 байт, что совпадает с размером страницы в данной системе, который мы узнали в разделе 12.6. Этот пример показывает, что следует всегда обращаться к результатам через указатель data_ptr, а не через переменные, адреса которых были переданы в rbuf. В нашем примере к результату типа «длинное целое» следует обращаться как *(long*)arg.data_ptr, а не oval (что мы делали в листинге 15.2).
Новый буфер выделяется вызовом mmap и может быть возвращен системе с помощью munmap. Клиент может повторно использовать этот буфер при новых вызовах door_call.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Буфер сообщений ядра
Буфер сообщений ядра Сообщения ядра хранятся в кольцевом буфере (log buffer) размером LOG_BUF_LEN. Этот размер можно изменять во время компиляции с помощью параметра CONFIG_LOG_BUF_SHIFT. Для однопроцессорной машины это значение по умолчанию равно 16 Кбайт. Другими словами в ядре может
Буфер обмена
Буфер обмена Буфер обмена – это специальная область оперативной памяти компьютера, в которой хранятся данные, предназначенные для перемещения или копирования как между окнами разных приложений, так и в одном и том же окне.В любой программе при выполнении команды
Приемный буфер сокета UDP
Приемный буфер сокета UDP Число дейтаграмм UDP, установленных в очередь UDP, для данного сокета ограничено размером его приемного буфера. Мы можем изменить его с помощью параметра сокета SO_RCVBUF, как мы показали в разделе 7.5. В FreeBSD по умолчанию размер приемного буфера сокета UDP
ГЛАВА 3. БУФЕР СВЕРХОПЕРАТИВНОЙ ПАМЯТИ (КЕШ)
ГЛАВА 3. БУФЕР СВЕРХОПЕРАТИВНОЙ ПАМЯТИ (КЕШ) Как уже говорилось в предыдущей главе, ядро операционной системы поддерживает файлы на внешних запоминающих устройствах большой емкости, таких как диски, и позволяет процессам сохранять новую информацию или вызывать ранее
Буфер сетевых операций
Буфер сетевых операций Буфер сетевых операций используется для хранения сетевых команд и потоков. Увеличение размера буфера может повысить скорость передачи данных. Но следует учитывать, что память для буфера сетевых операций резервируется за счет оперативной памяти,
Буфер обмена
Буфер обмена Смотрим, что у нас есть в группе Буфер обмена (рис. 1.13). Рис. 1.13. Группа Буфер обмена Кнопка с ножницами отвечает за вырезание текста (ее дублирует сочетание клавиш Ctrl+X). Выделяем часть текста (например, первый абзац). Нажимаем кнопку с ножницами или Ctrl+X –
Виртуальный буфер кадров
Виртуальный буфер кадров После запуска визуализации на экране появится активное по умолчанию окно Rendered Frame Window (Окно кадров визуализации), отображающее процесс вывода изображения (рис. 6.5). Рис. 6.5. Окно Rendered Frame Window (Окно кадров визуализации)Панель инструментов,
3.4. Буфер обмена
3.4. Буфер обмена При вырезании или копировании содержимое ячейки помещается в буфер обмена и становится доступным не только для работы в Word. Аналогично вы можете вставить в документ Word текст или иные данные, скопированные из другого приложения, с интернет,страницы и др.
Не будьте слишком умными
Не будьте слишком умными Вы можете попасть в глупое положение, если попытаетесь использовать операцию увеличения в неподходящих случаях. Например, вы могли бы захотеть улучшить нашу программу вывода на печать целых чисел и их квадратов, заменив имеющийся там цикл
8.3. Виртуальный буфер кадров
8.3. Виртуальный буфер кадров После запуска визуализации на экране появится активное по умолчанию окно Rendered Frame Window (Окно кадров визуализации), отображающее процесс вывода изображения (рис. 8.5). Рис. 8.5. Окно Rendered Frame Window (Окно кадров визуализации)Панель инструментов,
Буфер обмена
Буфер обмена ChangeClipboardChain Функция ChangeClipboardChain удаляет указанное окно из цепочки просмотра буфера обмена. BOOL ChangeClipboardChain ( HWND hWndRemove , HWND hWndNewNext ); Параметры hWndRemove - дескриптор окна, которое будет удалено из цепочки. Дескриптор должен был быть передан в функцию SetClipboardViewer. hWndNewNext
Буфер обмена
Буфер обмена Просмотр буфера обмена Пример на основе простого модуля-класса, осуществляющего просмотр буфера обмена.unit ClipboardViewer;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type TForm1 = class(tform) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject);private FNextViewerHandle : THandle; procedure
Копирование в буфер обмена
Копирование в буфер обмена Две вспомогательных процедуры:procedure CopyButtonClick(Sender: TObject);begin If ActiveControl is TMemo then TMemo(ActiveControl).CopyToClipboard; If ActiveControl is TDBMemo then TDBMemo(ActiveControl).CopyToClipboard; If ActiveControl is TEdit then TEdit(ActiveControl).CopyToClipboard; If ActiveControl is TDBedit then TDBedit(ActiveControl).CopyToClipboard;end;procedure PasteButtonClick(Sender:
Буфер обмена и удаление
Буфер обмена и удаление Редактор титров поддерживает также операции с объектами с помощью буфера обмена Windows: копирование, вырезание и вставку. Данные операции применяются к объектам титров аналогично, как и к другим объектам, например к тексту в текстовом редакторе,
§ 3.5 Перенос через буфер обмена
§ 3.5 Перенос через буфер обмена Простой, но незаслуженно игнорируемый способ. Он, как нетрудно понять, заключается в выделении фрагмента текста, или же текста целиком, копировании его в буфер обмена Windows, и последующей вставке в FB Editor.Копирование через буфер обмена, как
Буфер обмена и команды для работы с ним
Буфер обмена и команды для работы с ним В Блокноте можно выделять, а затем копировать, перемещать или удалять фрагменты текста. Для работы с фрагментами используют буфер обмена – специальную область памяти, куда можно помещать выделенные объекты. Описанные действия с
Стивенс Уильям Ричард
Просмотр ограничен
Смотрите доступные для ознакомления главы 👉