C 如何在Linux上运行以下消息队列?
银河帝国计划派遣一艘歼星舰攻击叛军基地。这艘歼星舰将容纳1024名帝国克隆人战士 在t=0时,只有一名士兵可用:上尉。从一岁生日起,克隆人战士每年可以克隆一次。这位皇帝想让歼星舰在短时间内做好行动准备 帝国的指挥结构非常简单:C 如何在Linux上运行以下消息队列?,c,linux,process,operating-system,fork,C,Linux,Process,Operating System,Fork,银河帝国计划派遣一艘歼星舰攻击叛军基地。这艘歼星舰将容纳1024名帝国克隆人战士 在t=0时,只有一名士兵可用:上尉。从一岁生日起,克隆人战士每年可以克隆一次。这位皇帝想让歼星舰在短时间内做好行动准备 帝国的指挥结构非常简单: 每个战士都向他的克隆人发出命令 没有与上级的沟通 编写具有以下要求的Linux C程序: 每个克隆战士都必须由一个单独的进程来表示 命令必须通过唯一(!)命名的消息队列传输 *从帝国官到船长有一个现有的消息队列/Imperator 克隆阶段结束后,每个克隆人战士都必
- 每个战士都向他的克隆人发出命令
- 没有与上级的沟通
- 每个克隆战士都必须由一个单独的进程来表示
- 命令必须通过唯一(!)命名的消息队列传输
*从帝国官到船长有一个现有的消息队列
/Imperator
- 克隆阶段结束后,每个克隆人战士都必须等待命令接收并发送给下级
- 考虑一下,哪一年有多少士兵可用:
——只有上尉,t=1——上尉和他的第一个克隆人,等等t=0
- 不要担心错误处理
<>但是我没有输出< < /p> 您的命令行(没有尾随<代码> <代码>,我认为这是一个发布事故) 意味着
- 编译clonew和clonew.c
- 进入名为“Wall”的可执行文件
- 使用rt库
如果它已经作为一个可执行但无提示的程序存在,它也会引发投诉。虽然机器可以很容易地读取代码,但对于人类来说,适当的缩进可能会有所帮助。我希望更多关于
gcc-Wall-o clonew clonew.c-lrt
。你能解释一下你在显示的命令行后面的想法吗?试着开始/Wall
并查看是否有输出;)
#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
gcc -o Wall clonew clonew.c -lrt