open: se o ficheiro não foi já aberto, lê o inode do disco para a tabela de inodes (cache). Senão, reserva uma entrada na cache e incrementa o contador de uso dessa entrada. Em seguida, cria uma nova entrada na tabela global de ficheiros abertos, e inicia o offset, modo e inode. Cria uma nova entrada na tabela de canais abertos do processo, que passa a apontar a entrada na tabela geral. close: liberta a entrada respectiva na tabela de canais do processo. Decrementa o contador da entrada na tabela global. Quando todos os canais para um ficheiro estão fechados, o inode na cache é libertado, e decrementa a entrada na cache. Quando chega a zero, liberta esta entrada também. lseek: o cursor e os direitos R, W, RW ficam associados ao canal, não ao ficheiro. Um processo pode abrir múltiplos canais para um mesmo ficheiro. Diferentes processos podem abrir canais para o mesmo ficheiro, mas os canais são logicamente distintos. link: cria uma nova entrada numa directoria, com um novo nome, mas com um inode igual ao de um ficheiro existente. Incrementa o número de links desse inode. unlink: remove o nome da entrada da directoria, e decrementa o contador de links do inode. Se o contador de uso > 0, há canais abertos para o ficheiro. Caso contrário, liberta o inode de memória e de disco. fork: cria mapa de memória do filho start address do filho := PC = Eret guarda start address do filho em tabela de processos do SO copia informação do pai insere filho na fila prontos empilha pid-filho na pilha do pai empilha pid 0 na pilha do filho retorna ao programa do pai Tabela Global de Ficheiros Abertos Cada entrada contém o valor corrente do cursor, o modo de acesso com que o canal foi aberto, e um apontador para o descritor único (inode) do ficheiro na tabela de inodes em memória. Execução de um processo: _start (endereço guardado no start address, especificado pelo compilador C) obtém argumentos e variáveis de ambiente para o mapa do processo, iniciando a pilha, e lança a função main. Arranque do SO: um pequeno programa para boostrap carrega para memória e executa o núcleo do SO. Depois das inicializações o SO cria o primeiro processo (init). Processo: Identificador (process identifier) Imagem do programa em memória (código, dados, pilha) Estado do CPU (registos) Estado do I/O (canais de IO: ficheiros abertos e buffers) Identificador do utilizador e seus direitos (ou permissões).