console open() para descritores de arquivo padrão

console open() para descritores de arquivo padrão

Estou lendo uma implementação de programa shell em C (o shell xv6 do curso 6.828 de Engenharia de Sistemas Operacionais do MIT).

A main()função deste 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:

"O shell garante que sempre tenha três descritores de arquivo abertos, que são os descritores de arquivo padrão para o console."


Entendo que open()retornará um descritor de arquivo com o menor número disponível, portanto, este código garante que não haja mais do que três descritores de arquivo 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, exceto 0, 1 e 2? Afinal é garantido que 0, 1 e 2 estarão associados ao console, não é mesmo? Por que o shell deveria se preocupar com descritores de arquivos com um número maior sendo fechado?

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

Responder1

Este trecho de código é aberto /dev/console. O descritor de arquivo resultante é o descritor de arquivo de número mais baixo 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 superior, o descritor será fechado e o loop será interrompido.

Quando o loop terminar, os descritores de arquivo 0 a 2 (stdin, stdout e stderr) têm garantia de abertura. Ou eles estavam abertos antes e podem estar conectados a qualquer arquivo ou acabaram de ser abertos e estão conectados a arquivos /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 queo padrão POSIX exige que exista. /dev/consoleé oconsole do sistema, que é para onde vão as mensagens syslog enviadas ao console; não é útil para um shell se preocupar com isso.

Responder2

É interessante para o loop. O 'open()' retorna o menor número de descritores de arquivo. Por exemplo, o fd atual é 10 que ilustra 0,1... e 9 estavam abertos antes. Está fechando um único descritor de arquivo extra no console que acabou de abrir.

informação relacionada