我有与操作系统课程相关的作业。在本作业中,将实现两个程序:名为“ get”的客户端程序和名为“ iserv”的服务器程序。该服务器将是一个多进程程序。 POSIX消息队列将用于进程间通信。服务器将如下启动:
iserv
在此处,是服务器要创建的消息队列的名称。是包含整数的文本文件的名称。
我的iserv.c程序:(未完成)
#include <linux/types.h>
#include <linux/unistd.h>
#include <stdio.h>
#include <mqueue.h>
#include <stdlib.h>
#include <linux/string.h>
#include <linux/fcntl.h>
#include <linux/errno.h>
#include <linux/wait.h>
#include <msg.h>
int main(int argc , char *argv[])
{
pid_t apid1;
FILE *fp;
mqd_t mq;
const char *msgqueue = "/serverqueue";
int oflag = (O_RDWR|O_CREAT);
mode_t mode = (S_IRUSR|S_IWUSR);
struct mq_attr *attr = NULL;
if(argc != 1)
{
printf("wrong number of arguments");
exit(1);
}
//create message queue
mq = mq_open(msgqueue ,oflag , mode , attr);
if(mq==-1)
{
perror("can not open msg queue\n");
exit(1);
}
printf("mq opened , mq id = %d\n" , (int) mq);
//create child process
apid1 = fork();
if(apid1 < 0)
{
perror("main():");
exit(1);
}
if(apid1 == 0)
{
printf("this is the first child, pid = %d\n", (int) getpid());
fflush(stdout);
}
}
如代码所示,将使用名称“ serverqueue”创建消息队列。然后,我将我的makefile创建为:
iserv:iserv.c
gcc -o iserv serverqueue infile.txt -lrt
clean:
rm -r *.o iserv
当我使用make命令运行此makefile时,出现服务器队列:没有此类文件或目录错误。
iserv行将在何处以及如何启动服务器?哪里错了?
请帮助我,谢谢!
最佳答案
你的makefile文件对我来说毫无意义。
-o指定编译的输出文件的名称。
如果您的源文件名为iserv.c,并且您希望将可执行文件命名为serverqueue,请进行编译
gcc -o serverqueue iserv.c -lrt
在您的makefile中,您忘记了源文件的.c扩展名。
我不明白您之所以包含infile.txt的原因。
根据您的评论进行编辑:
在家庭作业中,希望按以下方式启动服务器:iserv。 servq是服务器要创建的消息队列的名称,如果我是对的,它会在代码中创建为服务器队列,此外,inputfile是将包含大量正整数的文本文件的名称。
不,语句
iserv <servq> <inputfile>
与编译无关。一旦程序被编译,这就是应该使用该程序的方式。该程序的名称是iserv,因此您必须像这样编译代码gcc -o iserv iserv.c -lrt
开始程序类型
./iserv <servq> <inputfile>
其中
<servq>
是您的服务器队列,而<inputfile>
将是infile.txt。