Não é possível reescrever o “comando trap” para SIGTSTP, SIGTTIN e SIGTTOU

3

Eu quero capturar o sinal SIGTSTP, mas não consigo. Quando eu chamo apenas o comando trap sem argumentos, estou recebendo isto:

trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU

Obviamente, meu trap tem algum comportamento já predefinido. O problema é que não consigo reescrevê-lo, mesmo quando estou logado como root. Quando eu uso o comando trap , ele é simplesmente ignorado para esses três sinais. Caso contrário, funciona normalmente.

Eu tentei reescrevê-lo apenas por comando, assim:

trap -- 'echo SIGTSTP' SIGTSTP

A outra coisa estranha é que eu sou capaz de usar esses sinais e eles estão funcionando normalmente, eles não são ignorados. Eu posso simplesmente usar o SIGTSTP para parar de trabalhar em algum outro processo e fazê-lo continuar com o SIGCONT novamente.

Então, você sabe como reescrever esses comandos? E você poderia, por favor, explicar um pouco este estranho comportamento?

Meu sistema operacional é Lubuntu 15.04 e estou usando o GNU bash, versão 4.3.30 (1) -release (x86_64-pc-linux-gnu).

    
por Eenoku 05.09.2015 / 23:33

2 respostas

2

Com bash no Ubuntu 15.04, parece funcionar como esperado ... como você escreve seu script?

#!/bin/bash
set -e
trap 'echo TSTP' TSTP
trap 'echo TTIN' TTIN
trap 'echo TTOU' TTOU
trap
while :; do read a; done # wait forever

Sessão de amostra (digitada 3 vezes Ctrl + Z então Ctrl + C ):

$ ./signal.sh
trap -- 'echo TSTP' SIGTSTP
trap -- 'echo TTIN' SIGTTIN
trap -- 'echo TTOU' SIGTTOU
^ZTSTP
^ZTSTP
^ZTSTP
^C

Eu encontrei no manual que o bash ignora esses sinais quando é interativo e o controle de trabalho está ativado:

  1. Job Control (see Job Control) is enabled by default. When job control is in effect, Bash ignores the keyboard-generated job control signals SIGTTIN, SIGTTOU, and SIGTSTP.

Você pode desativar o cotrrol do trabalho em set +m . No entanto, o bash não permitirá atualizar os manipuladores no modo interativo de qualquer maneira:

$ bash -c trap
$ bash -c 'trap true TSTP && trap'
trap -- 'true' SIGTSTP
$ bash -i -c trap
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
$ bash -i -c 'trap true TSTP && trap'
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
$ bash -i -c 'set +m && trap true TSTP && trap'
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
    
por 06.09.2015 / 09:59
0

Você não mencionou qual shell está usando, então, caso isso seja um bug no shell, não há como ajudá-lo.

Olhando para a página de manual do Bourne Shell: link você vê o seguinte texto:

     bolic  names. Any attempt to set a trap on a signal that
     was ignored on entry to the current  shell  is  ineffec-
     tive.  An  attempt  to  trap on signal 11 (memory fault)
     produces an error.code here

Então, tudo pode estar OK, mas seu shell foi chamado com esses sinais ignorados.

Se você está em um sistema operacional moderno, pode ligar para

 'psig $$'

para obter a disposição do sinal do seu shell atual e você pode substituir $$ por outros IDs de processo para verificar outros processos.

    
por 06.09.2015 / 11:25

Tags