O UNIX tem conceitos separados "process", "process group" e "session".
Cada shell obtido no login se torna o líder de sua própria nova sessão e grupo de processos, e define o grupo de processos de controle do terminal para si mesmo.
O shell cria um grupo de processos dentro da sessão atual para cada "job" lançado e coloca cada processo iniciado no grupo de processos apropriado. Por exemplo, ls | head
é um pipeline de dois processos, que o shell considera um único trabalho, e pertencerá a um único grupo de processos novo.
Um processo é um segmento de execução (collection of) e outro contexto, como espaço de endereço e tabela de descritor de arquivo. Um processo pode iniciar outros processos; esses novos processos pertencerão ao mesmo grupo de processos que o pai, a menos que outra ação seja tomada. Cada processo também pode ter um "terminal de controle", que começa do mesmo modo que seu pai.
O shell tem o conceito de trabalhos "em primeiro plano" e trabalhos "em segundo plano". As tarefas em primeiro plano são grupos de processos com controle do terminal e as tarefas em segundo plano são grupos de processos sem controle do terminal.
Cada terminal possui um grupo de processos em primeiro plano. Ao trazer um trabalho para o primeiro plano, o shell o define como o grupo de processos de primeiro plano do terminal; ao colocar um trabalho em segundo plano, o shell configura o grupo de processos de primeiro plano do terminal para outro grupo de processos ou para ele mesmo.
Os processos podem ler e gravar em seu terminal de controle se estiverem no grupo de processos em primeiro plano. Caso contrário, eles receberão sinais SIGTTIN
e SIGTTOU
nas tentativas de ler e gravar no terminal, respectivamente. Por padrão, esses sinais suspendem o processo, embora a maioria dos shells mascarem SIGTTOU
para que um trabalho em segundo plano possa gravar no terminal ininterruptamente.