Почему fopen блокируется, когда на сервере запущен поток? - PullRequest
0 голосов
/ 06 ноября 2018

когда сервер открывает канал для чтения и запускает поток с помощью std :: async, в первый раз клиент может открыть канал для записи, но если клиент пишет снова, клиент блокируется до конца потока Сервер может быть открыт для чтения канала. Есть идеи?

Kai

1 Ответ

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

Извиняюсь за мое запутанное описание. Вот фрагменты кода.

Серверная сторона:

#define FIFO_FILE   "/tmp/fifo"

    while (1)
    {

    char readbuf[25];

    FILE *file = fopen(FIFO_FILE, "r");
    fgets(readbuf, 25, file);
    std::queue<std::string>().swap(msg);

    msg.push(readbuf);

    while (!feof(file))
    {
        fgets(readbuf, 25, file);
        msg.push(readbuf);
    }

    std::cout << "message num: " << msg.size() << std::endl;
    std::future<void> ret = std::async (std::launch::async, command_process, std::ref(msg), std::ref(binfo));
    fclose(file);
    std::cout << "messages are being processed!\n";

    }

клиентская сторона:

int main(int argc, char *argv[])
{
    FILE *fp;

    if((fp = fopen(FIFO_FILE, "w")) == NULL) {
        perror("fopen \n");
        return -1;
    }

    fputs(argv[1], fp);
    fclose(fp);
    return 0;
}

После запуска сервера он ожидает fgets. Когда клиент отправляет строку в FIFO, сервер получает строку и сохраняет ее в msg, затем передать его потоку command_process для обработки, сервер ждет на fopen для дальнейшего сообщения. ОДНАКО Если клиент попытается отправить сообщение еще раз, оно будет заблокировано при открытии клиента до тех пор, пока поток сервера не завершит обработку, сервер продолжит получать сообщение клиента.

Я ожидаю, что клиент не должен быть заблокирован для отправки сообщения, и сервер должен получить сообщение немедленно, а затем прервать предыдущее сообщение, чтобы обработать новое сообщение.

Kai

...