消息队列中的内容已更改

标签 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;
    }
}

这段代码是客户端的主要功能。上面没有问题,但是运行一次repeat语句后(当i = 1时),MakeDirectory()返回-1并出错。 (t指的是fork进程的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。我不知道为什么会发生这种情况。

最佳答案

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

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

您也没有检查 msgsnd 和 msgrcv 的返回码,这肯定是无休止的有趣调试的秘诀。

我建议您编辑问题以包含工作代码以及产生神秘结果的 shell 脚本。然后,如果愿意的话,有人可以对其进行调试并解释哪里出了问题。

我在这个领域的其他建议非常标准:W. Richard Stevens 的关于 TCP/IP 的书籍,特别是Unix 网络编程。如果您正在研究这些东西,您绝对会很高兴阅读它。

关于消息队列中的内容已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53416805/

相关文章:

C警告: control reaches end of non-void function + struct questions

javascript - 客户端 Firebase 云消息传递的安全性如何?

java - Amazon SQS 消息属性

stream - Apache Pulsar 支持的最大消息大小

node.js - NodeJs 服务器随机崩溃 : events. js:72 EIO

java - ActiveMQ 集群可以有在不同传输协议(protocol)上运行的代理吗?

c - 调用 pthread_spin_destroy() 时,到底释放了什么 "resources"?

c - 如何使用 printf() 实现可变字段宽度?

c - *** 检测到 glibc *** : free(): invalid next size (fast) in C code

html - 字体在本地工作但在服务器上不起作用