Я использую uuntu 18.04.1LTS и изучаю IPC с использованием C. В этот раз я тестирую ввод / вывод Unix с использованием LPC, и возникает проблема, когда к серверу одновременно подключается более одного клиента.(когда подключен только один клиент, проблем нет.)
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 относится к 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;
}
Это функция сервера, который запускается послепроверка pRequest.service, когда на клиенте включена функция MakeDirectory.
Опять же, нет ничего плохого в том, чтобы иметь одного клиента, и если их несколько.Я проверил с printf (), но сервер передает 0, а клиент получает -1.Я не знаю, почему это происходит.