如何在makefile中使用POSIX消息队列名称

时间:2013-10-18 15:26:27

标签: c linux makefile

我有一个与操作系统课程相关的作业。在这个作业中,将实现两个程序:一个名为“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时,我得到了serverqueue:没有这样的文件或目录错误。 服务器将在何处以及如何使用iserv线路启动?哪里错了?

请帮助我,谢谢!

1 个答案:

答案 0 :(得分:0)

你的makefile对我没用。 -o指定已编译输出文件的名称。 如果源文件名为iserv.c,并且您希望将可执行文件命名为serverqueue,则编译

gcc -o serverqueue iserv.c -lrt

在您的makefile中,您忘记了源文件的.c扩展名。

我不明白为什么你包含infile.txt。

根据您的评论编辑:

  

在作业中,希望服务器启动如下:iserv。 servq是服务器创建的消息队列的名称,如果我是真的,它在代码中创建为服务器队列,除了输入文件是包含大量正整数的文本文件的名称。

不,语句iserv <servq> <inputfile>与编译无关。这是程序编译后应该如何使用程序。程序的名称是iserv,因此您必须像这样编译代码

gcc -o iserv iserv.c -lrt

开始您的程序类型

./iserv <servq> <inputfile>

其中<servq>是您的服务器队列,<inputfile>是infile.txt。