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

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

Жанры

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;

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

Рассвет русского царства 3

Грехов Тимофей
3. Новая Русь
Фантастика:
историческое фэнтези
альтернативная история
5.00
рейтинг книги
Рассвет русского царства 3

П 2

Дронт Николай
2. Придворный
Фантастика:
фэнтези
героическая фантастика
5.00
рейтинг книги
П 2

Язычник

Мазин Александр Владимирович
5. Варяг
Приключения:
исторические приключения
8.91
рейтинг книги
Язычник

Гримуар темного лорда VI

Грехов Тимофей
6. Гримуар темного лорда
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда VI

Шайтан Иван 6

Тен Эдуард
6. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
7.00
рейтинг книги
Шайтан Иван 6

Законы Рода. Том 4

Мельник Андрей
4. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 4

Портрет дьявола: Собрание мистических рассказов

Скотт Вальтер
Проза:
классическая проза
8.09
рейтинг книги
Портрет дьявола: Собрание мистических рассказов

Пересмешник

Пехов Алексей Юрьевич
Фантастика:
фэнтези
9.38
рейтинг книги
Пересмешник

Князь Целитель 5

Ткачев Андрей Юрьевич
5. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Целитель 5

Барон. Книга вторая

Первухин Андрей Евгеньевич
6. Ученик
Фантастика:
фэнтези
попаданцы
5.40
рейтинг книги
Барон. Книга вторая

Гром Раскатного. Том 1

Володин Григорий Григорьевич
1. Штормовой Предел
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Гром Раскатного. Том 1

Потомок бога 3

Решетов Евгений Валерьевич
3. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Потомок бога 3

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

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Дракон

Бубела Олег Николаевич
5. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.31
рейтинг книги
Дракон