我仍在做操作系统课程的相同作业。现在,这是我的问题(首先,我正在重写硬件的内容):将实现两个程序:一个客户端程序“get”和一个名为“iserv”的服务器程序。客户端将要求服务器检索并发送一定范围内的所有整数。服务器将是一个多进程程序。它将创建子进程来处理来自客户端的请求。将使用 POSIX 消息队列。这是我的 iserv.c(服务器程序)
struct item /*struct for client requests to the server*/
{
int maxvalue;
int minvalue;
char *queuename;
};
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);
if(argc != 3)
{
printf("wrong number of arguments");
exit(1);
}
//create server message queue
mq = mq_open(msgqueue ,oflag , mode , NULL);
if(mq==-1)
{
perror("can not open msg queue\n");
exit(1);
}
printf("mq opened , mq id = %d\n" , (int) mq);
//******get the maxvalue and minvalue*******
mq_getattr(mq , &attr);
printf("mq maximum msgsize = %d\n" , (int) attr.mq_msgsize);
/*allocate large enough space for the buffer*/
buflen = attr.mq_msgsize;
bufptr = (char *)malloc(buflen);
n = mq_receive(mq , (char *)bufptr , buflen , NULL);
if(n == -1)
{
perror("mq_receive failed\n");
exit(1);
}
itemptr = (struct item *) bufptr;
printf("min value = %d\n" , itemptr->minvalue);
printf("max value = %d\n" , itemptr->maxvalue);
fprintf(stderr , "queue name = %s\n" , itemptr->queuename);
free(bufptr);
mq_close(mq);
mq_unlink(msgqueue);
return 0;
}
和 get.c(客户端程序)
struct item /*struct for client requests to the server*/
{
int maxvalue;
int minvalue;
char *queuename;
};
int main(int argc , char *argv[])
{
FILE *file;
mqd_t mq;
mqd_t mq2;
const char *msgqueue = "/serverqueue";
int oflag = (O_RDWR|O_CREAT);
mode_t mode = (S_IRUSR|S_IWUSR);
struct mq_attr *attr = NULL;
struct item item; //for serverqueue
int n;
if(argc != 5)
{
printf("wrong number of arguments");
exit(1);
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);
//send max - min values and the client message queue name to the serverqueue as a request
while(1)
{
item.maxvalue = atoi(argv[3]);
item.minvalue = atoi(argv[2]);
item.queuename = clientqueue;
n = mq_send(mq , (char *) &item , sizeof(item) , 0);
if(n==-1)
{
perror("mq_send failed\n");
exit(1);
}
else
{
printf("mq_send success , item size = %d\n" , sizeof(struct item));
printf("%d" , item.maxvalue);
printf("%d" , item.minvalue);
printf("\n" , item.queuename);
}
}
mq_close(mq);
mq_unlink(msgqueue);
return 0;
}
生成文件:
all: iserv get
iserv: iserv.c
gcc -g -Wall -o iserv iserv.c -lrt
get: get.c
gcc -g -Wall -o get get.c -lrt
clean:
rm -fr *o iserv get
现在,我的第一个问题是,即使我使用 mq_close 和 mq_unlink 删除消息队列,当我想运行这两个程序时,终端会说:“所有”都没有做任何事情。我需要删除其他内容以重新运行这两个程序,而无需手动关闭或删除任何内容。这是什么??
第二个问题是,char *queuename;
在消息响应中,服务器不能将其作为名称。它在终端上打印出一些愚蠢的东西,如何在此消息响应中将字符串 queuename 传递给服务器?
请帮帮我,作业截止日期快我需要解决这些问题,谢谢大家的帮助!