消息队列中的内容已更改

时间:2018-11-21 16:43:13

标签: c server message-queue lpc

我正在使用uuntu 18.04.1LTS,并使用C研究IPC。这次我正在使用LPC测试Unix i / o,并且有多个客户端同时连接到服务器时会出现问题。 (当仅连接一个客户端时,就没有问题。)

sprintf(s1,"./%sA",t);
sprintf(s2, "./%sB", t);

if (MakeDirectory(s1, 0755) == -1) {
    return -1;
}

if (MakeDirectory(s2, 0755) == -1) {
    return -1;
}



for (i = 0; i < 5; i++)
{
    memset(dirName, 0, SIZE);
    sprintf(dirName, "%s/%d",s1,i);
    usleep(300000);
    if (MakeDirectory(dirName, 0755) == -1) {
        return -1;
    }
}

此代码是客户的主要功能。顶部没有问题,但是在运行一次重复语句之后(当i = 1时),MakeDirectory()返回-1并出现错误。 (t表示分叉进程的pid转换为字符串。)

int MakeDirectory(char* path, int mode) {
    memset(&pRequest, 0x00, LPC_REQUEST_SIZE);
    memset(&pResponse, 0x00, LPC_RESPONSE_SIZE);

    pRequest.pid = getpid();
    pRequest.service = LPC_MAKE_DIRECTORY;
    pRequest.numArg = 2;
    pRequest.lpcArgs[0].argSize = strlen(path);
    strcpy(pRequest.lpcArgs[0].argData, path);
    pRequest.lpcArgs[1].argSize = mode;

    msgsnd(rqmsqid, &pRequest, LPC_REQUEST_SIZE, 0);
    msgrcv(rpmsqid, &pResponse, LPC_RESPONSE_SIZE, getpid(), 0);

    int res = pResponse.responseSize;

    return res;
}

这是客户的MakeDirectory,并且

int MakeDirectory(LpcRequest* pRequest) {
    memset(&pResponse, 0x00, LPC_RESPONSE_SIZE);

    char *path = pRequest->lpcArgs[0].argData;
    int mode = pRequest->lpcArgs[1].argSize;

    int res = mkdir(path, mode);

    pResponse.errorno = 0;
    pResponse.pid = pRequest->pid;

    printf("%ld\n", pResponse.pid);

    pResponse.responseSize = res;
    msgsnd(rpmsqid, &pResponse, LPC_RESPONSE_SIZE, 0);

    return res;
}

这是服务器的一项功能,当在客户端上启用了MakeDirectory功能时,该功能将在检查pRequest.service之后运行。

同样,拥有一个客户并没有错,如果有多个客户也没有错。我用printf()检查过,但是服务器通过0,客户端收到-1。我不知道为什么会这样。

1 个答案:

答案 0 :(得分:0)

您的代码中缺少太多内容,无法确切地了解正在发生的事情。我下注要么使用未分配的内存,要么不识别系统调用错误。

我正在使用LTS 16,并且我的系统上没有LpcRequest或LPC_REQUEST_SIZE等的定义。您没有显示它们的定义方式,因此我们不知道例如pRequest.lpcArgs[1]是否存在。

您也不会检查msgsnd和msgrcv的返回码,这是无休止地进行调试的可靠方法。

我建议您编辑问题以包括工作代码,以及产生神秘结果的shell脚本。然后,如果愿意的话,某人将能够对其进行调试并解释您出了问题的地方。

在这方面,我的其他建议非常标准:W. Richard Stevens的TCP / IP书籍,特别是 Unix网络编程。如果您正在学习这些东西,那么您一定会很高兴阅读它。