ID do grupo de processos da Shell = ID do grupo de processos da tarefa em primeiro plano?

2

Concluo decisivamente que o ID do grupo de processos da Shell = ID do grupo de processos da tarefa em primeiro plano das duas fontes abaixo. Quando um trabalho em segundo plano é selecionado para ser executado em primeiro plano, é o ID do grupo de processos do shell que muda para o ID do grupo de processos do trabalho em primeiro plano ou o contrário?

1.

To facilitate the implementation of the user interface to job control, the operating system maintains the notion of a current terminal process group ID. Members of this process group (processes whose process group ID is equal to the current terminal process group ID) receive keyboard-generated signals such as SIGINT. These processes are said to be in the foreground. Background processes are those whose process group ID differs from the terminal’s; such processes are immune to keyboard-generated signals. (Source)

2.

UNIX.SE

Adição:

$sleep 3000 &
$sleep 2000 &
$ps xao pid,ppid,pgid,sid,tty,comm | grep tty

PID     PPID    PGID    SID     TTY     COMMAND
1153    1135    1153    1153    tty1    bash
1173    1153    1173    1153    tty1    sleep
1189    1153    1189    1153    tty1    sleep
1219    1153    1219    1153    tty1    ps
1220    1153    1219    1153    tty1    grep
    
por Ron Vince 26.09.2015 / 09:05

2 respostas

4

I decisively conclude that Shell's process group ID = foreground job process group ID from the 2 sources below.

Você não deveria, já que nenhuma das fontes citadas afirmam que o PGID do shell é igual ao PGID do job em primeiro plano.

O PGID do shell não é alterado. Em um cenário normal com um shell interativo em execução em um terminal, o shell está em seu próprio grupo de processos e o PGID do shell é igual ao PID do shell.

Cada processo tem um PGID. O terminal tem um código de grupo do processo de primeiro plano associado . O grupo de processos em primeiro plano é, por definição, o grupo de processos com esse PGID.

Observe que, se o terminal for fornecido por um emulador de terminal, não haverá relação entre isso e o PID do emulador de terminal. Isso deve ser óbvio se você pensar em terminais de hardware, fornecidos inteiramente pelo kernel: não há nenhum processo de emulador de terminal nessa situação.

O PGID associado ao terminal pode ser definido pela função tcsetpgrp , que é chamada pelo shell quando inicia um programa externo em primeiro plano ou move um trabalho para o primeiro plano com fg .

    
por 27.09.2015 / 03:17
1

A ideia vem do csh de Bill Joy de 1979 por volta de 1980. O suporte relacionado ao kernel foi adicionado por Bill Joy para habilitar esse recurso.

Como o csh original foi escrito com o suporte a vfork () naquele momento, é difícil entender o código de csh como vfork () requer para reverter os efeitos no pai de ações no filho que são resultado do memória compartilhada entre pai e filho em vfork ().

Se você gosta de entender uma implementação em funcionamento, recomendo ler o código-fonte do Bourne Shell.

O shell quando ele inicia verifica se é um líder do grupo de processos ou não e, se necessário, torna-se um líder do grupo de processos.

Naturalmente, o shell mantém esse id durante sua vida, a menos que ele não seja um líder de grupo de processos na inicialização e goste de se suspender. Note que isto não é totalmente suportado no bash ...

Para tornar os trabalhos iniciados gerenciáveis, cada trabalho é executado em um ID de grupo de processos novo e próprio separado.

    
por 26.09.2015 / 11:59