Permitir que os encadeamentos (em c) imprimam mensagens sem interferir na entrada do usuário

5

Estou escrevendo um pequeno servidor para uso pessoal em c (não em c ++). Eu quero permitir a entrada do usuário no console como "servidor de desligamento" ou "reiniciar o servidor".

Para permitir este tipo de entrada, o servidor está rodando em um thread separado (pthreads), então o console não está bloqueado.

Eu também quero esse segmento para imprimir a saída no console como "um novo cliente conectado" ou "client requestet 'home.html'".

The problem is: If I'm typing something like "shutdown server" and at the same time the thread prints something like "a new client connected" everthing mixes up and I get something like "shuta new client connectedown server"

Existe uma maneira elegante de imprimir a saída do encadeamento e, ao mesmo tempo, permitir que o usuário insira comandos sem interferir?

Ou esta é uma ideia estúpida para começar? Se sim: Existe uma maneira padrão de lidar com coisas assim (ou seja, para controlar o servidor).

    
por mjb 04.03.2013 / 18:33
fonte

2 respostas

1

Quando você inicia seu servidor a partir de uma linha de comando, esse console deve ser usado como o log em execução (você também deve ter seus logs gravados em um arquivo para alguma permanência. Existem duas opções para manipular seu cenário.

  1. O servidor deve parar temporariamente de enviar para o console quando um usuário começar a digitar, ou seja, ativar um "modo interativo".
  2. Quando seu servidor for iniciado, abra uma "porta administrativa" que atenda aos comandos enviados para ele de um console diferente. Quando você quiser enviar o comando de desligamento, você utilizará um programa separado, o cliente administrador do servidor, para permitir a interface com o servidor por meio da linha de comando (ou de uma interface do usuário).
por 04.03.2013 / 18:45
fonte
2

Não há uma boa maneira de fazer o que você quer fazer.

Como você observou, se você permitir que o registrador continue sua saída enquanto o interpretador de comandos estiver ecoando a digitação do usuário, você terá uma confusão confusa.

O outro lado é o seguinte: se você bloquear o registrador quando o usuário começar a digitar, corre o risco de bloquear uma mensagem IMPORTANTE, que requer ação IMEDIATA.

A melhor resposta é ter dois (2) "consoles", exibidos simultaneamente, para que você não tenha que bloquear seu registrador.

Se você não puder fazer isso, porque (por exemplo), você está em uma porta serial bruta, a segunda opção é adicionar prioridades às suas mensagens de saída. Quando o usuário começa a digitar, as mensagens não importantes são mantidas até que ele termine de digitar. Mensagens importantes são transmitidas e, em seguida, o interpretador de comandos retypes sua linha até agora. Isso exigirá uma certa quantidade de espaço no buffer para empilhar suas mensagens enquanto ele está coçando a cabeça.

PESSOALMENTE, se eu fosse fazer algo assim, colocaria um tempo limite nas mensagens retidas: se ele não terminar de digitar seu comando em algum tempo, as mensagens sem importância anteriormente armazenadas serão descartadas e, em seguida, a linha de comando até agora é digitada novamente.

Normalmente, não vale a pena evitar a mistura de mensagens. Se você tiver um operador detalhado e um registrador de mensagens detalhado, você terá problemas maiores do que apenas fluxos de saída mistos.

    
por 04.03.2013 / 20:59
fonte