Содержимое в очереди сообщений изменено - PullRequest
0 голосов
/ 21 ноября 2018

Я использую 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.Я не знаю, почему это происходит.

1 Ответ

0 голосов
/ 22 ноября 2018

В вашем коде слишком много чего не хватает, чтобы точно знать, что происходит.Я делаю ставку на использование нераспределенной памяти или не распознаю ошибку системного вызова.

Я использую LTS 16, и в моей системе нет определения для LpcRequest или LPC_REQUEST_SIZE и т. Д. Вы не показываете, как они определены, поэтому мы не знаем, например, pRequest.lpcArgs[1]существует.

Вы также не проверяете код возврата для msgsnd и msgrcv, верного рецепта для бесконечных часов занимательной отладки.

Я предлагаю вам отредактировать ваш вопрос, включив в него рабочий код и сценарий оболочки, который дает загадочный результат.Тогда кто-нибудь сможет, если захочет, отладить его и объяснить, где вы ошиблись.

Мое другое предложение в этой области довольно стандартно: книги У. Ричарда Стивенса по TCP / IP, в частности Сетевое программирование Unix .Если вы изучаете этот материал, вы будете абсолютно рады его прочтению.

...