【发布时间】:2019-04-24 07:15:13
【问题描述】:
我在用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。我不知道为什么会这样。
【问题讨论】:
标签: c server message-queue lpc