Ruído STDOUT separado de ncurses

2

Estou tentando executar um aplicativo ncurses GUI em uma placa ARM. Estou executando-o usando o console serial ttyAMA0 port. Mas quando executo o programa ncurses, os outros processos executados em segundo plano imprimem mensagens de depuração, por exemplo, qDebug, qAssistir em STDOUT , ou seja, no layout da GUI e, portanto, resulta em ruído. Eu acho que o problema é porque todos os processos estão usando o mesmo dispositivo de console.

Portanto, há uma linha de comando ou uma solução programática para esse problema, de forma que não pude ver o outro processo ' STDOUT na minha ncurses GUI?

Eu tentei o GNU screen Isso não está realmente ajudando. Mesmo na sessão de tela, estou vendo a saída desses processos poluindo a tela

P.S: Eu tentei a solução gdb e ela funciona bem. Mas eu quero solução alternativa para isso

    
por GeekFactory 09.05.2013 / 05:24

1 resposta

3

Eu não acho que o que você quer é possível. Veja este tópico de superusuário intitulado: Como faço para destacar um processo do Terminal , inteiramente? .

Eu acho que você tem basicamente 3 opções.

Opção nº 1

Execute os scripts que estão poluindo o seu terminal de modo que eles sejam executados assim:

nohup somescript &> /dev/null &

Qual deve executar seus STDOUT & STDIN para / dev / null, faça o background deles e desconecte-os dos sinais do seu terminal se você precisar fechá-lo.

Opção nº 2

Use algo como screen . Graças a @StephaneChazelas nos comentários parece que existem screen pacotes disponíveis para o Debian na sua arquitetura .

Opção # 3

Se você não se importa se pausar temporariamente os processos que estão poluindo o STDOUT do seu terminal, você pode usar esta configuração: stty tostop . Isso tem o efeito de impedir que esses processos enviem seu STDOUT para o seu terminal. Quando terminar, você poderá reativá-lo com o comando stty -nostop . Achei isso no livro da 3ª edição do Unix Power Tools .

exemplo

Aqui está o meu aplicativo de exemplo que está poluindo o STDOUT do meu terminal:

$ while [ 1 ];do echo hi 2>&1;sleep 5;done &

Isso ecoa "hi" a cada 5 segundos assim:

[1] 30913
hi
$ hi
hi
hi
hi

Agora, quando eu corro stty tostop :

$ stty tostop
$ date
Thu May  9 14:22:44 EDT 2013
$ date
Thu May  9 14:23:52 EDT 2013

O problema dessa abordagem é que o outro processo é interrompido:

$ jobs
[1]+  Stopped                 while [ 1 ]; do
    echo hi 2>&1; sleep 5;
done

O problema com essa abordagem é que stty -tostop não retomou o processo, apenas a configuração do meu stty informando que STDOUT é permitido novamente. Então tive que retomar meu processo manualmente:

$ stty -tostop
$ jobs
[1]+  Stopped                 while [ 1 ]; do
    echo hi 2>&1; sleep 5;
done

$ fg
while [ 1 ]; do
    echo hi 2>&1; sleep 5;
done
hi
^Z

[1]+  Stopped                 while [ 1 ]; do
    echo hi 2>&1; sleep 5;
done
$ bg
[1]+ while [ 1 ]; do
    echo hi 2>&1; sleep 5;
done &
$ hi
hi
hi
hi
hi

O exemplo acima mostra minha execução stty -tostop , em seguida, executando o comando fg para foreground o processo while ... que estava poluindo meu STDOUT, então Ctrl + Z , para parar o processo while ... , use o comando background, bg .

Ideias adicionais

Confira as ferramentas de sugestões sobre estas Perguntas e respostas sobre como usar

Existem listas extensas de ferramentas e possíveis caminhos para você experimentar como alternativas para screen . Talvez use tmux ou reconecte os processos que estão poluindo seu STDOUT para outro terminal usando reptyr .

    
por 09.05.2013 / 06:10