Как запустить следующую очередь сообщений в Linux? - PullRequest
0 голосов
/ 02 июля 2018

Галактический Империум планирует отправить звездного разрушителя, чтобы атаковать базу мятежников. Этот звездный разрушитель должен принять 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

но я не получаю вывод

1 Ответ

0 голосов
/ 02 июля 2018

Ваша командная строка (без трейлинга ", который я считаю несчастным случаем)

gcc -o Wall clonew clonew.c -lrt

означает

  • скомпилируйте clonew и clonew.c
  • в исполняемый файл с именем "Стена"
  • используя rt lib

Я не уверен, почему использование «clonew» (сначала в команде компиляции, затем в попытке выполнения) не вызывает никакого предупреждения. Очевидно, вы намереваетесь создать и выполнить этот файл. Но он используется в качестве входного файла и должен, даже если он существует, но не является файлом синтаксиса C, вызвать некоторую жалобу.

Однако причина, по которой вы не получаете ожидаемый вывод при попытке выполнить clonew, заключается в том, что ваша команда компиляции не могла привести к созданию исполняемого clonew.

Почему попытка выполнить что-то, что либо еще не существует, либо является файлом кода C, не приводит к каким-либо предупреждениям, ошибкам или любому другому выводу, является загадкой.

Если она уже существует как исполняемая, но тихая программа, она также должна вызвать жалобу.

...