open () console para descritores de arquivos padrão

2

Estou lendo uma implementação do programa shell em C (o shell xv6 do curso de engenharia do sistema operacional 6.828 do MIT).

A função main() para este shell começa com o seguinte código:

//Assumes three file descriptors open
while((fd = open("console", O_RDWR)) >= 0){
    if(fd >= 3){
        close(fd)
        break;
    }
}

Esta é uma citação do livro xv6 que explica o código acima:

"The shell ensures that it always has three file descriptors open which are the default file descriptors for the console."

Eu entendo que open() retornará um descritor de arquivo com o número mais baixo disponível, portanto, este código está garantindo que não haja mais de três descritores de arquivos abertos, o que é bastante óbvio depois de ler a explicação do autor.

Mas a parte que não entendo é:

  1. Por que o shell deseja fechar todos os descritores de arquivo, mas 0, 1 e 2? Afinal, é garantido que 0, 1 e 2 serão associados ao console, não é? Por que o shell deve se preocupar com descritores de arquivos com um número maior sendo fechado?

  2. Eu acho que realmente não entendo o propósito do arquivo console (/ dev / console?) aqui.

por Rany Albeg Wein 10.04.2013 / 20:28

1 resposta

1

Este snippet de código abre /dev/console . O descritor de arquivo resultante é o descritor de arquivo com numeração mais baixa que ainda não está aberto. Se esse número for no máximo 2, o loop é executado novamente. Se esse número for 3 ou acima, o descritor será fechado e o loop será interrompido.

Quando o loop terminar, os descritores de arquivo 0 a 2 ( stdin, stdout e stderr ) estarão abertos. Eles já estavam abertos antes e podem estar conectados a qualquer arquivo ou acabaram de ser abertos, e estão conectados a /dev/console .

A escolha de /dev/console é estranha. Eu teria esperado /dev/tty , que é sempre o terminal de controle associado ao grupo de processos do processo de chamada. Este é um dos poucos arquivos que o padrão POSIX requer que exista . /dev/console é o console do sistema , que é onde as mensagens do syslog enviadas para o console vão ; não é útil para uma shell se importar com isso.

    
por 11.04.2013 / 01:45