Работа с двумя потоками, обрабатывающими ввод-вывод соответственно в одном окне терминала в C - PullRequest
0 голосов
/ 27 марта 2020

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

Однако вывод из одного pthread читается другим.

Я читал, что ncurses можно использовать для разделения терминала и параллельного выполнения обоих действий.

Есть ли другой способ сделать это в том же окне терминала?

void* send_message(){
    char message[MESSAGE_BUFFER_LEN];
    while(1){
        memset(message,'\0',sizeof(message));strcat(message,username);
        printf("%s",username);
        fgets(message+strlen(message),MESSAGE_BUFFER_LEN-strlen(username),stdin);
        sendAll(message,strlen(message));
    }
}

void* recieve_message(){
    char message[MESSAGE_BUFFER_LEN];
    while(1){
        recv(socket_fd,message,MESSAGE_BUFFER_LEN,0);
        printf("%s",message);
        memset(message,'\0',MESSAGE_BUFFER_LEN);
    }   
}

Поток ввода выполняет send_message, а поток вывода выполняет recieve_message.

Однако, независимо от того, какой поток вывода выводится на терминал, он принимается потоком ввода (send_message).

I don ' Я не хочу, чтобы это произошло.

Лучший выход из этого, который я нашел до сих пор, - это создать два windows, используя ncurses, и запустить output для одного и input для другого.

1 Ответ

2 голосов
/ 27 марта 2020

Забегая вперед, ожидая обратной связи от ОП. Я откорректирую при необходимости:

Ваши printf() и fgets() в send_message не являются атомами c. Ваш printf() в receive_message() может отправлять данные на консоль в промежутке между двумя операциями send_message(). Это ошибочный дизайн, который может привести к путанице и часто трудно воспроизвести ошибки. Либо перепроектируйте вашу программу так, чтобы один поток выполнял все задачи консоли ввода-вывода, либо используйте семафор для управления доступом к ресурсам общей консоли.

Поскольку вы используете pthreads, см .: https://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_lock.html

...