Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <unistd.h>
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- typedef struct mesgbuf {
- long mtype;
- char buff[1024];
- } mesg;
- char *data[] = {
- "Гой ты, Русь, моя родная,\n\
- Хаты - в ризах образа...\n\
- Не видать конца и края -\n\
- Только синь сосет глаза.\n\n",
- "Как захожий богомолец,\n\
- Я смотрю твои поля.\n\
- А у низеньких околиц\n\
- Звонно чахнут тополя.\n\n",
- "Пахнет яблоком и медом\n\
- По церквам твой кроткий Спас.\n\
- И гудит за корогодом\n\
- На лугах веселый пляс.\n\n",
- "Побегу по мятой стежке\n\
- На приволь зеленых лех,\n\
- Мне навстречу, как сережки,\n\
- Прозвенит девичий смех.\n\n",
- "Если крикнет рать святая:\n\
- Кинь ты Русь, живи в раю!\n\
- Я скажу: Не надо рая,\n\
- Дайте родину мою.\n"
- };
- void parent_proc(void) { //Функция родительского процесса
- mesg message;
- key_t key;
- int msgid, len;
- int done = 0; //Показатель окончания передачи данных процессом
- key = ftok("data", 'A'); //Получение ключа
- msgid = msgget(key, 0666 | IPC_CREAT); //Создание очереди сообщений
- message.mtype = 3L; //Тип сообщения 3 необходим для инициализации
- message.buff[0] = 0; //дочерних процессов. Отправляются два таких
- msgsnd(msgid, &message, sizeof(message), 0); //сообщения со значениями первого
- message.buff[0] = 1; //байта 0 и 1
- msgsnd(msgid, &message, sizeof(message), 0);
- for (;;) {
- if ((done & 0x1) == 0) { //Если первый процесс ещё передаёт //данные, то получаем сообщение
- len = msgrcv(msgid, &message, sizeof(message), 1L, 0);
- if (message.buff[0] == 0) done |= 0x1; //Если это пустая
- //строка, то устанавливаем флаг завершения передачи
- else write(1, message.buff, len); //иначе выводим строку
- }
- if ((done & 0x2) == 0) { //Аналогично для второго процесса
- len = msgrcv(msgid, &message, sizeof(message), 2L, 0);
- if (message.buff[0] == 0) done |= 0x2;
- else write(1, message.buff, len);
- }
- if (done == 0x3) { //Если оба процесса завершили передачу, то
- msgctl(msgid, IPC_RMID, 0); //завершаем работу
- return;
- }
- }
- }
- void child_proc(void) {
- mesg message;
- key_t key;
- int msgid, whoami, str, len;
- key = ftok("data", 'A'); //Получение ключа
- msgid = msgget(key, 0); //Открытие очереди сообщений
- msgrcv(msgid, &message, sizeof(message), 3L, 0); //Получение сообщения инициализации
- whoami = (int) message.buff[0]; //Номер процесса определяется содержанием сообщения
- message.mtype = whoami + 1; //Тип сообщений, отправляемых данным процессом
- for (str = 0; str < 5; str++) { //Цикл по четверостишиям
- if (str % 2 == whoami) { //В зависимости от номера, процесс будет передавать чётные или нечётные четверостишия
- len = sprintf(message.buff,"%s",data[str]);
- msgsnd(msgid, &message, len, 0); //Отправление сообщения
- }
- }
- message.buff[0] = 0;
- msgsnd(msgid, &message, 1, 0); //Отправление сообщения о завершении
- return;
- }
- int main() {
- if (!fork()) {
- child_proc();
- return 0;
- }
- if (!fork()) {
- child_proc();
- return 0;
- }
- parent_proc();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment