• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nazgulled

Apanhar vários sinais de uma simples bash e imprimir uma notificação

3 mensagens neste tópico

Estou aqui a fazer uma simples bash (nada de tão complicado como as que já vi por ai noutras universidades) e estou com alguns problemas em apanhar alguns sinais e de seguida imprimir uma notificação a avisar que esses sinais ocorreram.

Nota: a ideia não é interceptar os sinais e ignora-los, é só mesmo avisa ro utilizador que sinal X foi enviado para o processo Y.

Eu estou a discutir estas dúvidas por mail com o meu professor mas eu duvido que ele me responda ainda hoje pelo que deixo aqui a minha dúvida em forma do e-mail que acabei de lhe enviar que penso ser suficiente para perceberem onde está o meu problema.

Passo a citar:

Obrigado pelas explicações, contudo, estou com alguns problemas em colocar tudo em funcionamento...

Segundo tudo o que me disse, adaptei o código e cheguei ao seguinte:

http://gist.github.com/117657

O problema agora é que não estou a obter nenhum output a dizer que o processo terminou, parou ou continuou através de algum sinal, porque se eu terminar o processo normalmente, a mensagem já é imprimida. Ou seja, os 3 últimos "ifs" em childSignalHandler() estão a ser "ignorados".

Após executar a minha shell lancei o "gedit" em foreground. Abri outro terminal e após verificar qual o PID associado ao gedit fiz o seguinte:

kill -s SIGSTOP PID_DO_GEDIT

Desta forma penso que deveria estar a ver no primeiro terminal (onde a minha shell está a correr) o output do seguinte bloco de código:

if(WIFSTOPPED(status)) {
    printf("[%d] Stopped (Signal: %d)\n", pid, WSTOPSIG(status));
    return;
}

O problema é que ele nem se quer chega a fazer este "if" porque o pid é 0 e a condição para entrar no bloco de código com todos os "ifs" é ser maior que 0.

Não estou a perceber porquê que o pid é zero... Se eu mandei o sinal SIGSTOP para o processo do gedit, o meu childSignalHandler() deveria apanhar o sinal e apresentar o respectivo output, acho eu...

O que me está a falhar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O sinal SIGSTOP interrompe um processo, não o termina. Assim, aquele waitpid não vai retornar o id de nenhum processo (retorna 0), pois nenhum processo terminou.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Resolvi o problema substituindo o waitpid() por:

pid = waitpid(WAIT_ANY, &status, WNOHANG | WUNTRACED | WCONTINUED);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora