Pergunta

Eu estou escrevendo um servidor muito simples que faz um loop para sempre até Ctrl-C é pressionado. Eu gostaria de ter o manipulador de sinal para ctrl-c perto dos sockets abertos e desligar o servidor, mas eu não sei o que o escopo é para um manipulador de sinal, e eu não gosto da idéia de declarar o soquete (s) que eu preciso para fechar a ser global.

Alguém pode oferecer sugestões? Existe alguma maneira padrão para fazer isso?

Foi útil?

Solução

Bem, desde que você tem manipuladores de sinais, eu estou indo supor que você está em uma variante do Unix. Se assim for:

  • Um soquete é identificado para o kernel o número do arquivo, que é um int. Veja socket(2).
  • Que int é válido para o seu processo
  • Que int é válido para quaisquer processos bifurcados depois de criá-lo
  • Se não fechar-on-exec, é válida para qualquer processo que você exec.

Assim, é perfeitamente válida no seu manipulador de sinal. Como você faz o seu manipulador de sinal ciente de que número para uso depende do idioma que você está escrevendo em que você não especificou. Existem duas abordagens que irão funcionar em praticamente qualquer idioma

  • Se você não tem qualquer limpeza a fazer senão close e sair, basta ligar para sair. Ou definir a ação do sinal de padrão, que é a saída. O kernel irá fechar as tomadas.
  • Definir uma bandeira (que geralmente será um mundial de algum tipo) de dizer ao seu seleto circuito / votação para limpar e sair. Vantajoso em que você não tem que se preocupar se várias partes do seu programa são seguros para chamar a partir de um manipulador de sinal.

Outras dicas

Normalmente, é aconselhável não fazer nada muito em um manipulador de sinal; diferente de definir um sinalizador.

Então, quando o controle retorna para o loop principal que você pode examinar esta bandeira, sair do loop, fechar soquetes, destruidores executado em seus objetos etc, e sair de forma limpa.

manipuladores de sinal pode obter chamado em quase qualquer momento, inclusive no meio de chamadas de biblioteca C ou C ++, o que poderia ser um problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top