Пример
Пример
В листинге 6.21 приведен текст программы, которая определяет четыре ограничения, показанные в табл. 6.2.
Листинг 6.21. Определение системных ограничений для очередей сообщений System V
//svmsg/limits.c
1 #include "unpipc.h"
2 #define MAX_DATA 64*1024
3 #define MAX_NMESG 4096
4 #define MAX_NIDS 4096
5 int max_mesg;
6 struct mymesg {
7 long type;
8 char data[MAX_DATA];
9 } mesg;
10 int
11 main(int argc, char **argv)
12 {
13 int i, j, msqid, qid[MAX_NIDS];
14 /* определение максимального размера сообщения */
15 msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);
16 mesg.type = 1;
17 for (i = MAX_DATA; i > 0; i –= 128) {
18 if (msgsnd(msqid, &mesg, i, 0) == 0) {
19 printf("maximum amount of data per message = %d ", i);
20 max_mesg = i;
21 break;
22 }
23 if (errno != EINVAL)
24 err_sys("msgsnd error for length %d", i);
25 }
26 if (i == 0)
27 err_quit("i == 0");
28 Msgct(lmsqid, IPC_RMID, NULL);
29 /* количество сообщений в очереди */
30 mesg.type = 1;
31 for (i = 8; i <= max_mesg; i *= 2) {
32 msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);
33 for (j = 0; j < MAX_NMESG; j++) {
34 if (msgsnd(msqid, &mesg, i, IPC_NOWAIT) != 0) {
35 if (errno == EAGAIN)
36 break;
37 err_sys("msgsnd error, i = %d, j = %d", i, j);
38 break;
39 }
40 }
41 printf("%d %d-byte messages were placed onto queue,", j, i);
42 printf(" %d bytes total ". i*j);
43 Msgctl(msqid, IPC_RMID, NULL);
44 }
45 /* максимальное количество идентификаторов */
46 mesg.type = 1;
47 for (i = 0; i <= MAX_NIDS; i++) {
48 if ((qid[i] = msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT)) == –1) {
49 printf("%d identifiers open at once ", i);
50 break;
51 }
52 }
53 for (j = 0; j < i; j++)
54 Msgctl(qid[j], IPC_RMID, NULL);
55 exit(0);
56 }
Определение максимального размера сообщения
14-28 Для определения максимально возможного размера сообщения мы пытаемся послать сообщение, в котором будет 65 536 байт данных, и если эта попытка оказывается неудачной, уменьшаем этот объем до 65 408, и т.д., пока вызов msgsnd не окажется успешным.
Сколько сообщений различного размера может быть помещено в очередь?
29-44 Теперь мы начинаем с 8-байтовых сообщений и смотрим, сколько их поместится в очередь. После определения этого ограничения мы удаляем очередь (сбрасывая все эти сообщения) и повторяем процедуру с 16-байтовыми сообщениями. Мы повторяем это до тех пор, пока не будет достигнут максимальный размер сообщения из первого пункта. Ожидается, что небольшие сообщения будут превышать ограничение по количеству сообщений в очереди, а большие — ограничение по количеству байтов.
Сколько идентификаторов может быть открыто одновременно?
45-54 Обычно есть системное ограничение на количество одновременно открытых идентификаторов. Оно определяется непосредственно созданием очередей до тех пор, пока не произойдет ошибка при вызове msgget.
Запустим эту программу сначала в Solaris 2.6, а затем в Digital Unix 4.0B, и результаты подтвердят приведенные в табл. 6.2 величины:
solaris % limits
maximum amount of data per message = 2048
40 8-byte messages were placed on queue, 320 bytes total
40 16-byte messages were placed on queue, 640 bytes total
40 32-byte messages were placed on queue, 1280 bytes total
40 64-byte messages were placed on queue, 2560 bytes total
32 128-byte messages were placed on queue, 4096 bytes total
16 256-byte messages were placed on queue, 4096 bytes total
8 512-byte messages were placed on queue, 4096 bytes total
4 1024-byte messages were placed on queue, 4096 bytes total
2 2048-byte messages were placed on queue, 4096 bytes total
50 identifiers open at once
alpha % limits
maximum amount of data per message = 8192
40 8-byte messages were placed on queue, 320 bytes total
40 16-byte messages were placed on queue, 640 bytes total
40 32-byte messages were placed on queue, 1280 bytes total
40 64-byte messages were placed on queue, 2560 bytes total
40 128-byte messages were placed on queue, 5120 bytes total
40 256-byte messages were placed on queue, 10240 bytes total
32 512-byte messages were placed on queue, 16384 bytes total
16 1024-byte messages were placed on queue, 16384 bytes total
8 2048-byte messages were placed on queue, 16384 bytes total
4 4096-byte messages were placed on queue, 16384 bytes total
2 8192-byte messages were placed on queue, 16384 bytes total
63 identifiers at once
Причина, по которой в Digital Unix 4.0В получился результат 63 идентификатора, а не 64, как в табл. 6.2, заключается в том, что один идентификатор всегда используется системным демоном.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
25.5. Пример
25.5. Пример Для закрепления материала этой главы ниже приводится пример приложения, в котором задействовано большинство функциональных возможностей qdbm. Подразумевается, что в результате выполнения этого приложения будет создана простая база данных телефонных номеров,
27.1.1. Пример
27.1.1. Пример В главе 8 был представлен пример использования обычной разделяемой библиотеки. Библиотеку libhello.so, которую нам удалось создать, можно загружать во время выполнения. Программа loadhello загружает libhello.so динамически и вызывает функцию print_hello, которая находится в
Пример
Пример В листинге 11.1[1] показана простая программа, вызывающая функцию gethostbyname для любого числа аргументов командной строки и выводящая всю возвращаемую информацию.Листинг 11.1. Вызов функции и вывод возвращаемой информации//names/hostent.c 1 #include "unp.h" 2 int 3 main(int argc, char **argv) 4 { 5 char
Пример
Пример Сначала приведем пример с Ipv4:freebsd % traceroute www.unpbook.comtraceroute to www.unpbook.com (206.168.112.219): 30 hops max. 24 data bytes1 12.106.32.1 (12.106.32.1) 0.799 ms 0.719 ms 0.540 ms2 12.124.47.113 (12.124.47.113) 1.758 ms 1.760 ms 1.839 ms3 gbr2-p27.sffca.ip.att.net (12.123.195.38) 2.744 ms 2.575 ms 2.648 ms4 tbr2-p012701.sffca.ip.att.net (12.122.11.85) 3.770 ms 3.689 ms 3.848 ms5 gbr3-p50.dvmco.ip.att.net (12.122.2.66) 26.202 ms 26.242 ms
Пример
Пример Сначала мы запустим нашу программу с аргументом командной строки -0 и убедимся, что сервер имен отвечает на приходящие дейтаграммы, не содержащие контрольной суммы. Мы также задаем флаг -v.macosx # udpcksum -i en1 -0 -v bridget.rudoff.com domaindevice = en1local net = 172.24.37.64. netmask = 255.255.255.224cmd = udp and src host
9.4. Пример
9.4. Пример В архитектуре x86 есть инструкции, определяющие позицию старшего и младшего значащих битов в слове. Процессор выполняет эти инструкции очень быстро. С другой стороны, чтобы сделать то же самое на языке С, потребуется написать цикл с операциями побитового
Пример 10-27. Простой пример сравнения строк
Пример 10-27. Простой пример сравнения строк #!/bin/bash# match-string.sh: простое сравнение строкmatch_string (){ MATCH=0 NOMATCH=90 PARAMS=2 # Функция требует два входных аргумента. BAD_PARAMS=91 [ $# -eq $PARAMS ] || return $BAD_PARAMS case "$1" in "$2") return $MATCH;; * ) return $NOMATCH;; esac}a=oneb=twoc=threed=twomatch_string $a # неверное число
Пример 12-20. Пример форматирования списка файлов в каталоге
Пример 12-20. Пример форматирования списка файлов в каталоге #!/bin/bash# За основу сценария взят пример "man column".(printf "PERMISSIONS LINKS OWNER GROUP SIZE DATE TIME PROG-NAME " ; ls -l | sed 1d) | column -t# Команда "sed 1d" удаляет первую строку, выводимую командой ls,#+ (для локали "С" это строка: "total N",#+ где "N" -- общее
Пример 12-45. Пример работы с m4
Пример 12-45. Пример работы с m4 #!/bin/bash# m4.sh: Демонстрация некоторых возможносией макропроцессора m4# Строкиstring=abcdA01echo "len($string)" | m4 # 7echo "substr($string,4)" | m4 # A01echo "regexp($string,[0-1][0-1],&Z)" | m4 # 01Z# Арифметикаecho "incr(22)" | m4 # 23echo "eval(99 / 3)" | m4 #
Пример 24-2. Еще один пример проверки аргументов с помощью "И-списков"
Пример 24-2. Еще один пример проверки аргументов с помощью "И-списков" #!/bin/bashARGS=1 # Ожидаемое число аргументов.E_BADARGS=65 # Код завершения, если число аргументов меньше ожидаемого.test $# -ne $ARGS && echo "Порядок использования: `basename $0` $ARGS аргумент(а)(ов)" && exit $E_BADARGS# Если
Пример 25-8. Пример реализации алгоритма Решето Эратосфена
Пример 25-8. Пример реализации алгоритма Решето Эратосфена #!/bin/bash# sieve.sh# Решето Эратосфена# Очень старый алгоритм поиска простых чисел.# Этот сценарий выполняется во много раз медленнее# чем аналогичная программа на C.LOWER_LIMIT=1 # Начиная с 1.UPPER_LIMIT=1000 # До 1000.# (Вы можете
Пример
Пример В примере создаются два класса обработчик и инициатор события, устанавливается связь между ними и иллюстрируется обработка события в нескольких объектах одновременно:#include "stdafx.h" #include "sigslot.h"struct EventRaiser { // источник события signal<const char*> event; // const char* – тип аргумента.