ctrl c vs. ctrl z com trabalho em primeiro plano

26

Ctrl+ Zinterrompe o trabalho enquanto Ctrl+ Cmata o trabalho.

Por que é que? O outro caminho não faria mais sentido?

z@z-lap:~$ sleep 100&
[1] 4458
z@z-lap:~$ sleep 200&
[2] 4459
z@z-lap:~$ jobs
[1]-  Running                 sleep 100 &
[2]+  Running                 sleep 200 &
z@z-lap:~$ fg %1
sleep 100
^Z
[1]+  Stopped                 sleep 100
z@z-lap:~$ jobs
[1]+  Stopped                 sleep 100
[2]-  Running                 sleep 200 &
z@z-lap:~$ fg %1
sleep 100
^C
z@z-lap:~$ jobs
[2]+  Running                 sleep 200 &
neo0
fonte
4
"O outro caminho não faria mais sentido?" Você poderia especificar por que acha que sim?
glglgl

Respostas:

55

Eu acho que você pode estar confuso sobre a notação de controle do trabalho. Notavelmente "Interrompido" significa que um trabalho ainda está ativo, mas que sua capacidade de processar qualquer coisa foi mantida (não há tempo na CPU para processar qualquer coisa). Este é efetivamente um estado de "Pausa" ou "Suspenso", embora esse não seja o termo técnico correto.

  • CtrlCnão "interrompe" um trabalho, cancela ou mata. Tecnicamente, ele faz com que um sinal de interrupção seja enviado ao programa, solicitando que ele aborte o que está fazendo e saia imediatamente. Alguns programas ouvirão esse sinal e farão algum trabalho de limpeza de emergência antes de sair. Outros não responderão ao sinal e, posteriormente, serão abortados.

  • CtrlZ, por outro lado, "interrompe" um trabalho. Novamente, isso é feito com um sinal, mas desta vez é um 'stop' em vez de um sinal de 'interrupção'. Isso efetivamente o coloca em espera e retorna o controle para o shell, mas na verdade não elimina o trabalho. Se você deseja que esse trabalho continue em execução, você pode emitir um bgcomando para enviar o último trabalho parado para o segundo plano. Ele continuará sendo executado como um trabalho em segundo plano, como se você o tivesse executado &em primeiro lugar. Você também pode usar fgpara retomar o último trabalho interrompido em primeiro plano (permitindo que ele continue de onde parou e permitindo que você interaja com ele novamente).

Caleb
fonte
Eu ainda acho que Ctrl + Z envia SIGKILL e Ctrl + C envia SIGINIT. Portanto, o Ctrl + Z também mata o trabalho. Mas, no meu exemplo, Ctrl + Z apenas interrompe o trabalho como você disse. Então isso me deixa um pouco confuso.
neo0
10
@ neo0 - talvez você esteja acostumado a alguma configuração personalizada estranha? Você pode configurar essas coisas - embora provavelmente não deva, caso tenha um aplicativo que se baseie nesses mapas. Mas a configuração padrão é CTRL+C=SIGINTe CTRL+Z=SIGTSTP.
precisa saber é o seguinte
3
Caleb está certo (+1). O ctrl-Z interrompe o programa, o que você deve considerar como "congelamento", mas esse programa ainda está na memória, nos arquivos abertos etc. Ele não é morto / finalizado.
Olivier Dulac
"Suspender" pode ser mais claro que "parar".
Russell Borogove
1
@jiggunjer Isso é sobre a forma das coisas. Esta resposta fornece alguns antecedentes sobre por que duas etapas são necessárias e esta introduz algumas funções para tornar essas etapas mais simples.
Caleb