====== O Sistema de Arquivos ====== Como a linguagem C foi originalmente desenvolvida sobre o sistema operacional Unix, ela inclui um segundo sistema de E/S com arquivos em disco que reflete basicamente as rotinas de arquivo em disco de baixo nível do Unix. O sistema de arquivo tipo Unix usa funções que são separadas das funções do sistema de arquivo com buffer. Estas funções é parte integrante do sistema operacional e são conhecidas como sendo **funções de nível 2** devido a serem definidas na **sessão 2** do manual do Unix ou como sistema de arquivos sem buffer. As funções de E/S são listadas a seguir: * [[read]] - Lê um buffer de dados * [[write]] - Escreve um buffer de dados * [[open]]- Abre um arquivo em disco * [[close]] - Fecha um arquivo em disco * [[lseek]] - Move ao byte especificado em um arquivo * [[unlink]] - Remove um arquivo do diretório * [[remove]] - Remove um arquivo do diretório * [[rename]] - Renomeia um arquivo no diretório. * [[creat]] - Cria um novo arquivo ou trunca um arquivo já existente. Existe um conjunto de operações de E/S de mais alto nível, chamadas funções de nível 3, definidas como parte integrante da biblioteca padrão do **ANSI C**. Estas funções de alto nível fazem uso das funções de nível 2 também. Com as funções de nível 2 é possível se implementar qualquer tipo de acesso ou método de acesso à arquivos. Ao contrário do sistema de E/S de alto nível (nível 3), o sistema de baixo nível (nível 2) não utiliza ponteiros de arquivo do tipo [[FILE]], mas descritores de arquivo do tipo [[int]]. Na função de abertura de arquivo, o sistema operacional devolve para o programa o descritor de arquivo que ele atribuiu ao arquivo. Todas as outras funções devem receber este descritor para identificar sobre qual arquivo estamos querendo realizar a operação. ===== Descritores Pré-alocados ===== Desde os primeiros sistemas Unix, por convenção, o interpretador de comandos (//shell//) sempre que cria um processo, abre três arquivos e passa os descritores dos mesmos para o processo. Estes descritores são utilizado por todas as funções de nível 2 e 3 do sistema. O descritor de número 0 (zero) representa a Entrada Padrão (nas funções de nível 3, [[stdin]]). Todas as funções de entrada de dados que não especificam um descritor de arquivos irão ler os seus dados deste arquivo. O descritor número 1 representa a Saída Padrão (nas funções de nível 3, [[stdout]]). Todas as funções que fazem a saída de dados e não especificam um descritor irão utilizar este arquivo como saída de dados. Por último, o descritor 2 é reconhecido pelo sistema como sendo a Saída de Erro Padrão do sistema (nas funções de nível 3, [[stderr]]). Todas as funções que emitem mensagens de erro irão utilizar este descritor com saída das informações.