%20para%20descritores%20de%20arquivo%20padr%C3%A3o.png)
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 é:
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?
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.