Чтение онлайн

на главную - закладки

Жанры

UNIX: взаимодействие процессов

Стивенс Уильям Ричард

Шрифт:

■ IPC_SET — установка значений четырех полей структуры msqid_ds данной очереди равными значениям соответствующих полей структуры, на которую указывает аргумент buff: msg_perm.uid, msg_perm.gid, msg_perm.mode, msg_qbytes.

■ IPC_STAT — возвращает вызвавшему процессу (через аргумент buff) текущее содержимое структуры msqid_ds для указанной очереди.

Пример

Программа в листинге 6.1 создает очередь сообщений, помещает в нее сообщение с 1 байтом информации, вызывает функцию msgctl с командой IPC_STAT, выполняет команду ipcs, используя функцию system, а затем удаляет очередь, вызвав функцию msgctl с командой IPC_RMID.

Листинг 6.1. [1] Пример использования функции msgctl с командой IPC_STAT

//svmsg/ctl.с

1 #include "unpipc.h"

2 int

3 main(int argc, char **argv)

4 {

5 int msqid;

6 struct msqid_ds info;

7 struct msgbuf buf;

8 msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);

1

Все исходные тексты, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com/download.

9 buf.mtype = 1;

10 buf.mtext[0] = 1;

11 Msgsnd(msqid, &buf, 1, 0);

12 Msgctl(msqid, IPC_STAT, &info);

13 printf("read-write: *03o, cbytes = %lu, qnum = %lu, qbytes = %lu\n",

14 info.msg_perm.mode & 0777, (ulong_t) info.msg_cbytes,

15 (ulong_t) info.msg_qnum, (ulong_t) info.msg_qbytes);

16 system("ipcs –q");

17 Msgctl(msqid, IPC_RMID, NULL);

18 exit(0);

19 }

Мы собираемся отправить сообщение размером 1 байт, поэтому можно просто воспользоваться стандартным определением структуры msgbuf из <sys/msg.h>. Выполнение этой программы приведет к следующему результату:

solaris %ctl

read-write: 664, cbytes = 1, qnum = 1, qbytes = 4096

IPC status from <running system> as of MOn Oct 20 15:36:49 1997

T ID Key MODE OWNER GROUP

Message Queues:

q 1150 00000000 –rw-rw-r-- rstevens other1

Выведенные значения соответствуют ожидаемым. Нулевое значение ключа обычно соответствует IPC_PRIVATE, как мы отмечали в разделе 3.2. В этой системе на очередь сообщений накладывается ограничение по объему в 4096 байт. Поскольку мы записали сообщение с 1 байтом данных и msg_cbytes имеет значение 1, это ограничение накладывается на объем полезных данных и не включает тип сообщения (long), указываемый для каждого сообщения.

6.6. Простые примеры

Поскольку очереди сообщений System V обладают живучестью ядра, мы можем написать несколько отдельных программ для работы с этими очередями и изучить их действие.

Программа msgcreate

В листинге 6.2 приведена программа msgcreate, создающая очередь сообщений.

9-12 Параметр командной строки –e позволяет указать флаг IPC_EXCL.

16 Полное имя файла, являющееся обязательным аргументом командной строки, передается функции ftok. Получаемый ключ преобразуется в идентификатор функцией msgget.

Листинг 6.2. Создание очереди сообщений System V

//svmsg/msgcreate.c

1 #include "unpipc.h"

2 int

3 main(int argc, char **argv)

4 {

5 int c, oflag, mqid;

6 oflag = SVMSG_MODE | IPC_CREAT;

7 while ((c = Getopt(argc, argv, "e")) != –1) {

8 switch (c) {

9 case 'e':

10 oflag |= IPC_EXCL;

11 break;

12 }

13 }

14 if (optind != argc – 1)

15 err_quit("usage: msgcreate [ –e ] <pathname>");

16 mqid = Msgget(Ftok(argv[optind], 0), oflag);

17 exit(0);

18 }

Программа msgsnd

Программа msgsnd приведена в листинге 6.3. Она помещает в очередь одно сообщение заданной длины и типа.

Мы создаем указатель на структуру msgbuf общего вида, а затем выделяем место под реальную структуру (буфер записи) соответствующего размера, вызвав calloc. Эта функция инициализирует буфер нулем.

Листинг 6.3. Помещение сообщения в очередь System V

//svmsg/msgsnd.c

1 #include "unpipc.h"

2 int

3 main(int argc, char **argv)

4 {

5 int mqid;

6 size_t len;

7 long type;

8 struct msgbuf *ptr;

9 if (argc != 4)

10 err_quit("usage: msgsnd <pathname> <#bytes> <type>");

11 len = atoi(argv[2]);

12 type = atoi(argv[3]);

13 mqid = Msgget(Ftok(argv[1], 0), MSG_W);

14 ptr = Calloc(sizeof(long) + len, sizeof(char));

15 ptr->mtype = type;

Поделиться:
Популярные книги

Кодекс Крови. Книга ХI

Борзых М.
11. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Кодекс Крови. Книга ХI

Газлайтер. Том 10

Володин Григорий Григорьевич
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Изгой

Майерс Александр
2. Династия
Фантастика:
фэнтези
попаданцы
рпг
аниме
5.00
рейтинг книги
Изгой

Искатель 7

Шиленко Сергей
7. Валинор
Фантастика:
рпг
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Искатель 7

Проводник

Кораблев Родион
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41
рейтинг книги
Проводник

Неучтенный элемент. Том 7

NikL
7. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 7

Бояръ-Аниме. Газлайтер. Том 34

Володин Григорий Григорьевич
34. История Телепата
Фантастика:
фэнтези
боевая фантастика
аниме
7.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 34

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила

Хозяин Теней 3

Петров Максим Николаевич
3. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Хозяин Теней 3

Я еще царь. Книга XXX

Дрейк Сириус
30. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я еще царь. Книга XXX

Старый, но крепкий 3

Крынов Макс
3. Культивация без насилия
Фантастика:
рпг
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 3

Кодекс Охотника. Книга XXXIX

Сапфир Олег
39. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIX

Гром с севера

Мазуров Дмитрий
8. Громовая поступь
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Гром с севера

ЖЛ. Том 6

Шелег Дмитрий Витальевич
6. Живой лед
Фантастика:
фэнтези
городское фэнтези
5.00
рейтинг книги
ЖЛ. Том 6