1

我仍在做操作系统课程的相同作业。现在,这是我的问题(首先,我正在重写硬件的内容):将实现两个程序:一个客户端程序“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 传递给服务器?

请帮帮我,作业截止日期快我需要解决这些问题,谢谢大家的帮助!

4

1 回答 1

0

这是您的主要问题:

struct item   /*struct for client requests to the server*/
{
    int maxvalue;
    int minvalue;
    char *queuename;  //<=== NO GOOD
};

您不能通过 MQ 发送指向另一个进程的指针 - 它在发送过程中指向的内容在接收过程中毫无意义。您需要将该指针更改为固定长度的字符数组。就像是

char queuename[50];

正如我在评论中所说,您需要将 queuename 复制到该数组中。

于 2013-10-22T03:43:16.170 回答