Галактический Империум планирует отправить звездного разрушителя, чтобы атаковать базу мятежников. Этот звездный разрушитель должен принять 1024 имперских клона-воина.
На t=0
есть только один солдат: капитан. С первого дня рождения воин-клон может клонироваться раз в год. Император хочет, чтобы звездный эсминец был готов к действиям в короткие сроки.
Структура имперского командования очень проста:
- Каждый воин посылает команды своим клонам
- нет связи с вышестоящим
Напишите C-программу для Linux со следующими требованиями:
- Каждый воин-клон должен быть представлен отдельным процессом
- Команды должны передаваться через однозначно (!) Именованные очереди сообщений.
* Существует существующая очередь сообщений
/Imperator
от Императора до капитана
- После фазы клонирования каждый воин-клон должен ждать получения команд и передачи своим подчиненным
Советы и требования:
- Посмотрите, сколько солдат доступно в каком году:
t=0
- только капитан, t = 1 - капитан и его первый клон и т. Д.
- Не беспокойтесь об обработке ошибок
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <errno.h>
// Exercise „clone warriors“
#define NUM 10
#define SIZE_MSGBUF 500
#define MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH |S_IWOTH)
mqd_t QueueArray[NUM]; // queues to my clones
void cleanQueueArray(void) { // support function for init: start with no queues
for (int i=0; i<NUM; i++) QueueArray[i] = 0;
}
int main(void) {
char cNameBossQueue[100] = "/Imperator"; // boss queue‘s default name
mqd_t BossQueue; // boss queue to receive commands of the father‘s process
struct mq_attr attr;
attr.mq_maxmsg = 10;
attr.mq_msgsize = SIZE_MSGBUF;
attr.mq_flags = 0;
int nPrio=0;
char cMsgbuf[SIZE_MSGBUF+1] = "";
cleanQueueArray(); // init: no queues to any clones at the beginning
// phase 1 / clone phase takes NUM years:
for (int i=0; i<NUM; i++) {
pid_t npid_child = fork();
if (npid_child > 0) { // Father. Create + store command channel to clone:
char cQueue[100];
sprintf(cQueue, "/Queue%d", npid_child);
QueueArray[i] = mq_open(cQueue, O_CREAT|O_WRONLY, MODE, &attr);
} else { // Child. Remember the name of the boss queue:
sprintf(cNameBossQueue, "/Queue%d", getpid());
cleanQueueArray(); // Child has no queues to clones currently
}
}
// Phase 2 / battle phase. Receive and transmit orders:
BossQueue = mq_open(cNameBossQueue, O_RDONLY, MODE, &attr);
mq_receive(BossQueue, cMsgbuf, SIZE_MSGBUF, &nPrio);
// Send orders to all of my clones:
for (int i=0; i<NUM; i++) {
if (QueueArray[i] > 0) {
mq_send (QueueArray[i], cMsgbuf, strlen(cMsgbuf), 0);
}
}
// Cleanup work...
return 0;
}
Я попытался запустить это с помощью
gcc -o Wall clonew clonew.c -lrt"
./clonew
но я не получаю вывод