Sistema Operacional Unix

0
1563
DICAS PARA ANALISAR, COMPREENDER, E INTERPRETAR TEXTOS

Autoria: André Gasperin Zamboni

Sistema Operacional

Um Sistema Operacional é um programa especial de computador (software) que controla o hardware do mesmo.

Fig. 1.1

Conforme a figura 1.1 o S.O serve de ligação entre os recursos computacionais e os seus consumidores em potencial, geralmente coordenando a locação de recursos limitados para um grande número de consumidores. Por exemplo: um usuário (ou um programa) solicita o armazenamento de um arquivo no disco, o S.O intervém para gerenciar a alocação de espaço em disco e a transferência da informação da memória para o disco.

Sistema Operacional UNIX

No final da década de 60, três empresas uniram-se em um projeto para desenvolver um S.O interativo, multiusuário e multitarefa denominado MULTICS. As empresas eram a MIT ( Massachusets Institute of Tecnology), uma empresa de pesquisa tecnológica, a GE (General Eletric), que pretendia na época comercializar computadores e os Laboratórios Bell (Bell Labs) da American Telephone and Telegraph (AT&T), empresa que monopolizava os serviços de telefonia americana.
A Bell Laboratories retirou-se do projeto por não gostar do resultado, pois o MULTICS era um S.O muito grande com muitas característcas em BATCH e não permitia o desenvolvimento de software em equipe; um outro motivo foi que as três empresas envolvidas no empreendimento tinham objetivos muito distintos, o que dificultaria o surgimento de um produto final com um resultado satisfatório para cada uma delas. Um dos cientistas do Bell Labs, Ken Thompson, necessitava desenvolver um programa que o auxiliasse na sua atividade, surgiu então o UNIX, um sistema aberto, de tempo compartilhado (time-sharing system), onde controla as atividades e recursos do computador, tendo o poder de administrar múltiplos processos e usuários ao mesmo tempo.

História do Sistema Operacional UNIX

Final dos Anos 60 Desenvolvimento do MULTICS

1969 Surgi o Sistema Operacional UNIX

Meados dos Anos 70 A Universidade da Califórnia em Berkeley (BSD) e outras universidades também pesquisam e desenvolvem o sistema UNIX

Início dos anos 80 Interesse comercial pelo sistema UNIX
Interesse DARPA em BSD

Final dos anos 80 Desenvolvimento de padrões
Fundação da Open Software Fundation (OSF)

Início dos anos 90 POSIX, padronização da interface interativa do usuário.

O sistema operacional UNIX nasceu nos Laboratórios Bell em 1969. Ken Thompson, com a ajuda de Rudd Canaday, Doug Mcllroy, Joe Ossana, e Dennis Ritchie, elaborou um sistema pequeno para fins gerais em tempo compartilhado e logo atraiu a atenção das pessoas com a promessa de proporcionar boas ferramentas para preparação de documento para o setor administrativo dos Laboratórios, os primeiros pesquisadores obtiveram um computador maior e prosseguiram o desenvolvimento.
Nos meados dos anos 70, o sistema UNIX foi licenciado para universidades e ganho imensa popularidade na comunidade académica porque:

• Era pequeno – os sistemas antigos usavam um disco de 512 K bytes, 16 K bytes para o sistema e 8 K bytes para os programas para os usuários, e 64 K bytes por arquivos.
• Era flexível – a fonte era disponível era escrito em uma linguagem de programação de alto nível que proporcionava a portabilidade do sistema operacional.
• Era barato – as universidades conseguiam ter um licença do sistema UNIX basicamente pelo preço de uma fita. As primeira versões do sistema UNIX proporcionavam recursos poderosos disponíveis apenas em sistemas operacionais e rodavam em computadores mais caros.

Essas vantagens superavam as desvantagens do sistema na época:

• Não tinha suporte – a AT&T já tinha investido muito no MULTICS e não estava interessada em explorar o sistema operacional UNIX.
• Ele tinha bugs – e como não havia suporte, não havia garantia de que os bugs seriam identificados e consertados.
• Tinha pouca ou quase nenhuma documentação – porém sempre se podia usar o código fonte.

Quando o sistema operacional UNIX chegou à Universidade da Califórnia em Berkeley, os usuários de Berkeley criaram sua própria versão do sistema. Com o apoio do Departamento de Defesa, eles incorporaram vários novos recursos. Berkeley, na qualidade de instituto de pesquisa, ofereceu a seus licenciados uma política de suporte semelhante à da AT&T – nenhuma!
A AT&T reconheceu o potencial do sistema operacional e começou a licencia-lo comercialmente. Para melhorar o produto, uniu os projetos de desenvolvimento do sistema UNIX em processo de conclusão em diferentes departamentos da empresa, e também começou a incorporar a aperfeiçoamentos desenvolvidos em Berkeley.

O sucesso posterior do produto pode ser atribuído aos seguintes fatores:

• Uma interface de usuário flexível e um ambiente operacional que inclui inúmeros utilitários.
• A modularidade do design do sistema que permite a inclusão de novos utilitários.
• A capacidade de suportar múltiplos processos e múltiplos usuários ao mesmo tempo.
• O apoio do DARPA em Berkeley.
• A disponibilidade para uso em micro-computadores relativamente poderosos e baratos.
• A disponibilidade para uso em uma ampla gama de plataformas de hardware.
• Padronização da Definição de Interface, proporcionando portabilidade de aplicativo.

Detalhamento:

1956 A AT&T é processada com base na legislação anti-monopólio, que a proíbe de atuar em algumas áreas não regulamentadas.
1965 Laboratórios Bell – MULTIplexed Information and Computing System (MULTICS) – a pesquisa começa no ambiente multiusuário final, um projeto em parceria com o Massachusetts Institute of Technology e a General Electric.
1969 Laboratórios Bell, nasce o sistema UNIX – Ken Thompson, durante pesquisa de desenvolvimento de sistema de arquivos, cria o Space Travel, um programa que simulava o movimento de corpos no espaço, em um velho minicomputador PDP-7. Criou um sistema de arquivos, um assembler, um editor e um shell simples. POR QUE? Tinha bons gráficos, era barato se comparado ao DEC-10 que apoiava uma interface interativa de tempo compartilhado, e ele queria um computador com recursos convenientes, interativo e práticos. Um trabalho anterior fora feito em um mainframe GE645 que operava por lotes e era caro para acessar. Os programas tinham
1970 originalmente compilação cruzada para o PDP-7 e eram carregados através de uma fita de papel. Devido ao processo acima citado, os Laboratórios Bell poderiam pesquisar o sistema UNIX, porém estavam proibidos de vender, divulgar ou dar suporte a qualquer produto baseado no sistema UNIX. Tinham permissão para distribuir software para universidades apenas para fins educativos.
1970 Sistema UNIX baseado em assembler portado a PDP-11/20 (minicomputador de 16 bits) para pesquisa de recursos de processamento de texto.
1971 1a. edição – O Departamento de Patentes dos Labs. Bell foi o primeiro cliente do sistema UNIX. A grande vantagem para os usuários era não ter que passar por recursos de computação centralizados.
Ken Thompson desenvolve a linguagem interpretada B, baseada na linguagem BCPL de Martin Richards, e subseqüentemente a linguagem NB (new B).
1972 2a edição – pipes, suporte de linguagem, tentativa de escrever kemel em NB (precursora de C). I O sistemas.
Dennis Ritchie desenvolve a linguagem C.
1973 4a. edição – Kernell e shell são reescritos em C. O Grupo de Sistemas UNIX criado nos Labs. Bell para apoio interno. 25 sistemas.
Primeira distribuição não oficial para universidades.
1974 5a. – edição – Oficialmente disponível para universidades apenas para fins educativos. A AT&T NÃO fornece suporte, período de testes, garantia, consertos de bug.. O pagamento DEVE ser adiantado.
1975 6a. edição – Licenças disponíveis para usuários do governo e comerciais.
Thompson frequenta a Universidade da Califómia em Berkeley (UCB). Começa o desenvolvimento em Berkeley.
1977 500 sistemas, a maior parte deles em 125 universidades.
1 BSD desenvolvido em PDP- 11.
Primeiros portes para equipamento não-DEC.
1978 7a. edição – a portabilidade é a meta principal. Swapping, o Compilador C K&R, o Bourne shell e arquivos maiores são suportados. O sistema UNIX é portado ao VAX/11780 (espaço de endereçamento de 32 bits, com 4GB de espaço de endereçamento virtual). O resultado é o UNIX/32V.

1979 BSD 3.0 – aperfeiçoou o UNIX/32V para incorporar memória virtual e suportar paginação por demanda. A principal meta é a capacidade de rodar processos maiores que a memória fisica.

1980 BSD 4.0 – inclui controle de tarefa, memória virutal, paginação, drivers para periféricos de terceiros (não DEC), suporte terminal independente para aplicativos baseados em tela, como o vi. Atraiu o interesse da Agência de Projetos Avançados de Pesquisa do Departamento de Defesa (DARPA) que procurava um sistema operacional padrão não proprietário para sistemas de pesquisa em rede para CAD/CAM, inteligência artificial, e aplicações visuais. O projeto de memória virtual de Berkeley era mais avançado do que o da AT&T.

1981 fundado /usr/group – primeira organização a iniciar a definição de padrões no ambiente do sistema UNIX.

1982 System III – combinava recursos de várias variantes do sistema UNIX desenvolvido com AT&T, integrava alguns recursos BSD, como curses, controle de tarefa, termcap e vi.

1983 Versão 1 do System V- AT&T anuncia suporte oficial e baixa os preços. AT&T autoriza os fabricantes de microprocessadores a suportar o sistema UNIX.
BSD 4.2 -versão baseada em pesquisa do DARPA, incorpora IPC, memória virtual, sistema de arquivos de alta velocidade, arquitetura de rede (TCP/IP).
Surgimento dos microcomputadores de 16 e 32 bits. BSD-IPC, rede, sistema rápido de arquivos. 1OO.OOO ambientes com sistema UNIX.

1984 Sentença do processo anti-monopólio, Bell perde os direitos de atuar em telefonia, porém é permitido à AT&T competir no mercado de computadores.
Versão 2 do System V – suporta paginação, memona compartilhada.
Padrão /usr/group submetido ao POSIX.

1985 Definição de lnterface do System V (SVID) – define a interface de chamada do sistema.
Seqüência de Verificação do System V (SVVS) – seqüência de testes, de cuja aprovação dependerá o certificado de confonnldade a SVID.

1986 BSD 4.3 – elimina bugs primários, controle de tarefa, sinais confiáveis.

1987 Versão 3 do System V – STREAMS, IPC, controle de tarefa.
Guia de Portabilidade do X/Open (XPG) – especifica o interface do kernel e vários programas utilitários para proporcionar a portabilidade de aplicativos entre as implementações do sistema UNIX. 300.000 sistemas UNIX vendidos. No total, 750.000 sistemas UNIX.

1988 Edição 2 do SVID – bloqueio de arquivo.
Fundação da Open Software Fundation – uma empresa independente constituída para desenvolver e proporcionar um ambiente de computação com base em padrões industriais e com as mais avançadas tecnologias disponíveis.

1989 Versão 4 do System V – conformidade ao POSIX. I
XPG3 – suporta POSIX.1 e Commom Appllcation Enviromnent , seleciona padrões que serão incorporados para diversos aspectos do ambiente de computação, não apenas a Interface do sistema operacional, com a finalidade de promover portabilidade

1990 Edição 3 de SVID – POSIX.1, FIPS 151-1 e Padrão C.

Características:

• Modularidade
• Multitasking
• Multiuser
• Portabilidade
• Comunicações

Modularidade

O UNIX é único em seu desenho modular, que permite usuários adicionar ou remover partes para adaptá-lo às suas necessidades específicas. Os módulos se encaixam com conexões-padrão. É possível tirar um módulo e substituí-lo por um outro ou expandir o sistema acrescentando vários módulos. De uma certa maneira, o sistema UNIX de cada pessoa é único. Muitos usários acrescentam ou eliminam módulos sempre que precisam, adaptando suas implementações às suas necessidades. É geralmente possível remover um módulo, sem prejudicar a operação do resto do sistema. Esta característica é muito útil nas implementações em microcomputadores, onde as unidades de disco têm capacidade limitada. A remoção de arquivos desnecessários abre espaço para mais arquivos de dados.
Multitasking

A capacidade de multitasking do UNIX permite que mais de uma tarefa seja realizada simultaneamente. Esta é uma das principais características do UNIX. As tarefas que estão em execução concorrem pelos recursos da máquina que são controlados pelo sistema. É possível, portanto, que um programa que atualize um banco de dados esteja rodando ao mesmo tempo que a impressão de um relatório esteja sendo realizada e uma tela de terminal esteja sendo enviada.
Em uma interface gráfica com um ambiente de janelas pode-se disparar cada tarefa em uma janela shell. Já em um ambiente não gráfico, as tarefas que podem ser executadas sem a intervenção do usuário são colocadas em background. Em foreground deixa-se as tarefas que necessitam da intervenção do usuário, como a edição de um arquivo.

Multiuser

Um sistema multiusuário permite que vários usuários utilizem o computador simultaneamente. Terminais (teclado e tela) podem ser conectados a um computador e os usuários destes terminais podem acessar o sistema e executar tarefas simultaneamente. O sistema irá controlar todos os acessos aos seus recursos. Estes terminais não precisam estar diretamente conectados ao computador; podem ser terminais remotos acessando pela rede.

Portabilidade

A portabilidade é a possibilidade dos softwares que operam em uma máquina operarem em uma outra diferente. Há dois tipos de portabilidade a serem considerados:

•Portabilidade do sistema operacional
•Portabilidade dos aplicativos

Mais de 90% do programa kernel está escrito em C e menos de 10% em linguagem de máquina. Assim, na pior das hipóteses, apenas 10% do programa kernel terá de ser reescrito ao se deslocar o kernel para uma máquina com arquitetura diferente. Os programas aplicativos escritos em linguagem de nível mais alto, como C, são facilmente portáveis para vários sistemas UNIX. Basta que sejam recompilados, exigindo, as vezes, poucas alterações.

Comunicações

No UNIX temos dois tipos de comunicações, quais sejam, comunicação entre programas e comunicação entre usuários. A comunicação entre programas é realizada através de mensagens, semáfaros ou memória compartilhada. Estes mecanismos, também conhecidos por IPC, interprocess comunications, são extensões do System V.
A comunicação entre usuários pode se realizar de diversas maneiras, entre elas há o mail, que é um programa para enviar e receber mensagens eletrônicas, o write, que escreve uma mensagem no terminal de outra pessoa logada no sistema, o wall, que escreve mensagens nos terminais de todas as pessoas logadas no sistema, o talk, que permite uma conversa em tempo real.
Há também a comunicação entre os sistemas, tais como uucp (UNIX to UNIX Copy Protocol).

Recursos do UNIX

O Sistema UNIX proporciona um sistema operacional time-sharing que controla as atividades e recursos do computador e uma interface flexível e interativa. O sistema foi projetado para administrar múltipos processos ao mesmo tempo e suportar usuários, com a finalidade de facilitar o compartilhamento de dados entre membros de uma equipe de projeto. O ambiente operacional foi projetado com uma arquietura modular em todos os níveis. Ao instalar o sistema UNIX, você precisa instalar apenas partes que são relevantes pra suas necessidades operacionais, omitindo os excessos. Por exemplo, o sistema UNIX fornece uma imensa coleção de utilitários de desenvolvimento de programas, porém se você não está fazendo desenvolvimento de programas, precisa apenas instalar o compilador básico A interface de usuário também suporta muito bem a filosofia modular. Os comandos que nada sabem um do outro podem facilmente ser combinados através de pipelines para desempenhar manipulações mais complexas.

O Sistema Operacional

O Kernel é o sistema operacional. É responsável pelo gerenciamento dos recursos disponíveis pelo acesso ao hardware. O kernel contém módulos para cada componente do hardware que com ele faz interface. Esses módulos proporcionam a funcionalidade que permite acesso de programas à CPU, memória, discos, terminais, rede, etc. À medida que novos tipos de hardware são instalados no sistema, novos módulos podem ser incorporados ao kernel.

O Ambiente Operacional

Ferramentas e Aplicativos.
O design modular do ambiente do sistema UNIX é mais evidete nesta camada. A filosofia de comandos do sistema UNIX espera que cada comando faça uma coisa bem, e o conjunto de comandos forme uma caixa de ferramentas. Quando você tem uma tarefa a executar, você puxa a(s) ferramenta(s) adequadas. Tarefas complexas podem ser feitas combinando-se adequadamente s ferramentas.
Desde sua criação, a “caixa de ferramentas” do sistema UNIX incluiu mais do que os comandos básicos necessários para se interagir com o sistema. O sistema UNIX também fornece utilitários para:
correio eletrônico (mail, mailx)
edição de arquivos (ed, ex, vi)
processamento de textos (sort, grep, wc, awk, sed)
formatação de textos (nroff)
desenvolvimento de programas (cc, make, lint, lex)
gerenciamento de programas (SCCS, RCS)
contabilidade de processo e de usuários (ps, du, acctcom)
Como o ambiente do usuário do sistema UNIX foi projetado para ser interativo, programável e modular, novos utilitários podem ser facilmente desenvolvidos e adicionados à caixa de ferramentas do usuário, podendo as ferramentas desnecessárias serem removidas sem prejudicar o funcionamento do sistema.
Por exemplo, um programador de aplicativos e um redator técnico estão usando sistemas UNIX. Eles usarão muitos comandos comuns, embora suas aplicações sejam muito diferentes. Usarão também utilitários adequados apenas para seu projeto. O sistema do programador de aplicativos incluirá utilitários para desenvolvimento e gerenciamento de programas, enquanto que o sistema do redator técnico conterá aplicativos para formatação e processamento de textos, e gerenciamento de documentos. É interessante observar que o utilitário que o programador usa para o controle de revisão de programas pode também ser usado pelo redator técnico para revisão de documentos. Por conseguinte, seus sistemas parecem muito semelhantes, entretanto, cada usuário selecionou e descartou os módulos que são relevantes para suas necessidades.
A popularidade do sistema UNIX pode ser atribuída em grande parte:
* Ao fato de ser completo e flexível, permitindo-o adaptar-se a muitos ambientes de aplicativos
* Os inúmeros utilitários que são incluídos no ambiente operacional aumentando a produtividade dos usuários.
* A disponibilidade e portabilidade do sistema com relação às várias plataformas de hardware.

O Shell

O shell é um interpretador interativo de comandos. Os comandos são introduzidos no prompt do shell e trabalhados à medida que são emitidos. Um usuário comunica-se com o computador através do shell. O shell pega a entrada que o usuário digita no teclado e traduz o comando para uma forma que o kernel possa entender. E o sistema executa o comando.
Podemos observar que o shell é separado do kernel. Se você não gostar da interface provida pelo shell fornecido, pode facilmente substitui-la. Muitos shell estão disponíveis atualmente. Alguns são acionados por comandos e outros incluem um menu de interface. Os shells comuns que acompanham o sistema UNIX incluem tanto um interpretador de comandos quanto uma interface amigável.
Há quatro tipos de shell geralmente disponíveis no ambiente do sistema UNIX:

* Bourne shell (/usr/old/bin/sh) – o shell original oferecido nos sistemas da AT&T, desenvolvido por Stephen Bourne nos Laboratórios Bell. Provê um interpretador de comandos do sistema UNIX e suporta uma interface programável para desenvolver programas shell ou scripts, como são geralmente chamados. As interfacs programáveis e interativas fornecem recursos, tais como definição e substituição de variáveis, teste de variável e de arquivo, desvios e loops.

* C shell (/usr/bin/csh) – o shell desenvolvido na Universidade da Califónia em Berkeley por Bill Joy e povido em sistemas baseados em BSD. Esse shell era chamado de shell Califórnia, daí sendo abreviado para C shell. É considerado um aperfeiçoamento do Bourne shell porque oferece recursos interativos, como empilhamento de comandos, que permite facilmente a reentrada e edição de comandos introduzidos anteriormente, e o uso de nomes alternativos personalizados para comandos existentes.

* Korn shell (/usr/bin/ksh) – é um projeto mais recente dos Laboratórios Bell desenvolvido por David Korn. Pode ser considerado um Bourne shell aperfeiçoado porque suporta a interface programável simples do Bourne shell, porém tem os recursos interativos do C shell. O código também foi otimizado para oferecer um shell mais rápido e eficiente.

* POSIX shell (/usr/bin/sh) – linguagem de programação de comandos conforme POSIX e interpretador de comandos residente no arquivo /usr/bin/sh. Esse shell é semelhante ao Korn shell em muitos aspectos, provê um mecanismo de registro histórico, suporta controle de tarefas e outros recursos interessantes.

Estrutura de arquivos

Arquivos são centrais para o UNIX de uma maneira não encontrada em outros sistemas operacionais. Comandos são arquivos executáveis, usualmente encontráveis em locais previsíveis na árvore de diretórios. Privilégios do sistema e permissões são controlados em grande parte através de arquivos. Dispositivos de I/O e arquivos de I/O não são distinguidos nos níveis mais altos. Até mesmo a comunicação entre processos ocorre através de entidades similares a arquivos.
O UNIX tem uma organização de diretórios hierárquica em formato de árvore conhecida como filesystem. A base desta árvore é um diretório chamado root directory. Em sistemas UNIX, todo espaço em disco disponível é combinado em uma única árvore de diretório abaixo do /, sendo que o local físico onde um arquivo reside não faz parte da especificação do arquivo UNIX.
O acesso a arquivos é organizado através de propriedades e proteções. Toda segurança do sistema depende, em grande parte, da combinação entre a propriedade e proteções setadas em seus arquivos e suas contas de usuários e grupos.

Enfatizando:

•Tudo em UNIX é um arquivo
•Unix tem uma organização hierárquica de arquivos chamada de filesystem
•Acesso aos arquivos é organizado através de propriedades e proteções

Mapeando arquivos para o disco

Um inodo é uma estrutura de dados em disco que descreve e armazena os atributos do arquivo, incluindo sua localização:

Campos de um inode •user e group •tipo do arquivo •tempo de criação, acesso e modificação (modo) •número de links •tamanho •endereço no disco

Quando uma partição de disco é inicializada, um número específico de inodes é criado. Este torna-se o número máximo de arquivos de todos os tipos, incluindo diretórios, arquivos especiais e links que podem existir no disco.

Tipos de arquivo

•Arquivos comuns
•Diretórios
•Arquivos Especiais
•Links
••hard
••simbolic

Arquivos Comuns: são arquivos contendo dados, normalmente chamados de arquivos. Estes podem ser arquivos de dados ASCII ou binários, executáveis.
Diretórios: são arquivos binários consistindo de uma lista de outros arquivos que ele contém (possivelmente outros diretórios). As entradas dos diretórios são pares filename-inode. Este é o mecanismo que associa inodos e localização nos diretórios. Os dados no disco não têm o menor conhecimento de sua localização (lógica) no filesystem.
Arquivos Especiais: são os mecanismos utilizados para I/O de dispositivos no UNIX. Eles residem no diretório /dev e seus subdiretórios. Há dois tipos de arquivos especiais: arquivos especiais de caracteres e arquivos especiais de blocos. Os primeiros correspondem a acesso a dispositivos baseado em caracteres, que não é bufferizado. Os arquivos especiais de blocos correspondem a acesso a dispositivos com I/O de blocos. Dados são transferidos em blocos.
Links: são mecanismos que permitem vários filenames referirem a um único arquivo no disco. Há dois tipos de links: hard e simbólico ou soft. Um hard link associa dois ou mais filenames com o mesmo inodo. Hard links compartilham o mesmo bloco de dados embora funcionando como entradas de diretório independentes.
Link simbólicos são pointers files que apontam para outro filename no filesystem.

Arquivos Especiais

•Sockets
•Named pipes

Sockets: são um tipo especial de arquivo utilizado para comunicação entre processos. São parte da funcionalidade de interconectividade TCP/IP, primeiramente disponível nos sistemas BSD, mas parte de qualquer versão moderna hoje.
Um socket pode ser pensado como pontos finais de comunicação, unidos a portas particulares do sistema, as quais processos estão conectados.
Named pipes: são canais abertos pelo nome por aplicações. São características do SV que migraram para todas as versões de UNIX. Named pipes frequentemente residem no diretório /dev, e eles servem como outro mecanismo para facilitar a comunicação entre processos.

Processos

Um processo é um simples programa que está rodando em seu espaço de endereçamento virtual próprio. É distinto de um job ou comando, que, em sistemas UNIX, podem ser compostos de muitos processos realizando uma única tarefa. Comandos simples como “ls” são executados como simples processos. Um comando composto, contendo pipes irá executar um processo por segmento pipe. Em sistemas UNIX, o gerenciamento dos recursos da CPU deve ser feito, em grande parte, por contrôle de processos, pois os recursos de alocação e as facilidades de execução em bacht disponíveis em outros sistemas são pouco desenvolvidas ou inexistentes.

Tipos de Processos

•Interativos
•Batch
•Deamons

Processos interativos: são iniciados a partir de, e controlados por uma sessão terminal. Estes processos podem rodar tanto em foreground como em background.
Processos batch (ou em lote): são processos não associados a nenhum terminal. Ao invés disso, são submetidos a uma fila, da qual jobs são executados sequencialmente. UNIX oferece um comando bacht muito primitivo.
Daemons: são processos servidores, inicialmente inicializados durante o boot, que rodam continuamente enquanto o sistema estiver ativo, esperando, em background, até que um processo requisite seus serviços. Por exemplo, network daemons ficam em estado idle até que um processo requisite serviço de rede.

Atributos

•Process ID (PID)
•Parent process (PPID)
•TTY
•UID real e efetiva (RUID, EUID)
•GID real e efetiva (RGID, EGID)

Process ID, PID: é um número que identifica unicamente este processo e é usado para referir-se a ele.
Parent process ID, PPID: é o process ID do processo pai do processo, ou seja, o processo que o criou.
TTY: é o dispositivo de terminal associado com o processo
O UID real: de um processo é o UID do usuário que o criou. O UID efetivo, é o UID que é utilizado para determinar o acesso do processo a recursos do sistema. Usualmente, RUID e EUID são os mesmos e o processo tem os mesmos acessos que o usuário que o disparou. Entretanto, quando SUID está setado em um executável, então o EUID do processo executando é setado para o UID do propritário do arquivo, que herda as permissões deste.
O GID real e efetivo de um processo é grupo primário ou corrente do usuário. Seu GID efetivo, utilizado para determinar permissões de acesso, é o mesmo que o GID real, exceto quando o SGID está setado em um executável. Neste caso, o EGID assume o GID do grupo proprietário do arquivo.

Dispositivos

Os dispositivos em um sistema UNIX apresentam três características fundamentais, quais sejam:

•Transparência
•Simplicidade
•Mounting

Uma das forças do UNIX é que usuários não precisam saber das específicações dos dispositivos, ou devices, muito freqüentemente. Eles não precisam saber, por exemplo, em que disco um arquivo que necessitam está armazenado fisicamente. Os mecanismos dos arquivos especiais do UNIX permitem muitas operações de I/O em dispositivos parecerem como se fossem operações de I/O em arquivos. Já o admindistrador do sistema não tem todo este luxo, pelo menos não o tempo todo.
UNIX merge todos os arquivos acessados por usuários para uma única estrutura hierárquica de diretório. Os arquivos contido nesta estrutura podem estar espalhados por muitos disco diferentes.
No filesystem total do UNIX, os arquivos e diretórios fisicamente localizados em cada partição de disco são montados nesta estrutura hierárquica em forma de árvore. Uma parte integral do processo de montar uma partição de disco engloba mergir sua estrutura de diretório local para hierarquia total de diretório UNIX. Uma vez isso feito, os arquivos fisicamente residindo naquele disco podem ser acessados através da tradicional sintaxe de path (caminho) separada por barras. O sistema cuida do mapeamento para o dispositivo físico correto.

Pipes

Pipe é um valiozissima característica do sistema UNIX que permite que vários programas sejam concatenados. Deste modo, o output de um programa é input do próximo. Esse recurso é muito utilizado para aplicar filtros. Por exemplo, para listar os processos de um determinado usuário, manda-se listar os proces-sos e a saída deste comando serve de entrada para um comando que filtre nesta lista todas as ocorrências do usuário procurado.

exemplo% ps | grep joao

Redirecionamento

O redirecionamento, como o nome já diz, serve para redirecionar a entrada e saída padrão do sistema. A entrada padrão é o teclado e a saída padrão é o terminal. É possível redirecionar a entrada para que o comando leia um arquivo ao invés do teclado e redirecionar a saída para que o resultado seja enviado para um arquivo ao invés do terminal.

•redirecionamento de entrada: “<"
•redirecionamento de saída: “>”
•redirecionamento de saída: “>>”

Conexões Tee

As conexões Tee agem exatamente como uma conexão tê. Tee transcreve o resultado de um comando para a saída padrão e para um arquivo.

exemplo% who | sort | tee logados | wc -l

O Sistema UNIX e seus Padrões

Desde o seu surgimento, o sistema UNIX foi desenvolvido com especial atenção na portabilidade. Como a maior parte do sistema operacional e utilitários foram escritos em C (em oposição ao assembler) , o sistema UNIX não está restrito a um processador ou plataforma de hardware. Por outro lado, como o sistema UNIX foi escrito em uma linguagem de alto nível, ele é fácil de modificar, como mostram as mais de 100 empresas que oferecem implementações do UNIX (licenciadas pela AT&T) e os clones do sistema UNIX (novas implementações de uma interface UNIX-Iike que não exigem uma licença da AT&T). Embora a maior parte dos sistemas sejam derivados do UNIX AT&T, do UNIX BSD ou uma combinação de ambos, cada implementação pode incorporar extensões únicas para o sistema operacional, tal como capacidades de tempo real e podem não apresentar a compatibilidade entre diferentes implementações do sistema UNIX. (Na verdade, o System V já incorporou muitos dos recursos populares do BSD). Com a finalidade de estimular a consistência de implementação para implementação, estão sendo formulados padrões para o ambiente operacional do sistema UNIX. O objetivo desses padrões é proporcionar:

1. Portabilidade – a capacidade de facilmente transferir um aplicativo de uma implementação do sistema UNIX para outra.
2. lnteroperabilidade – a capacidade de compartilhainento de informações entre aplicativos que rodam em diferentes implementações do sistema UNIX.
3. Escalabilidade – Permite que os usuários possam escolher o hardware dentre uma gama de opções – de pequenos a grandes sistemas dependendo de suas necessidades. Permite ainda capacidades de atualização a medida que crescem as necessidades das aplicações.

Apesar das muitas implementações do sistema UNIX, as diferenças ao nível de usuário são pequenas, Visto que a maior parte delas foram desenvolvidas a partir de origens comuns. Desta forma, os padrões inicialmente se concentraram na interface de código fonte de interface para o kernl e apenas recentemente estão avaliando a padronização da interface interativa de usuário.

Objetivos dos Padrões

Definir a lnterface, e não a Implementação

Os padrões não têm como finlidade definir uma interface totalmente nova, porém criar uma interface portátil bem definida com base nas implementações atuais do sistema UNIX. É importante compreender que os padrões destinam-se a definir interfaces para o ambiente operacional do sistema UNIX, e não determinar como um padrão deve ser implementado. Por conseguinte, os padrões do sistema UNIX não exigem que todos os sistemas UNIX para computadores sejam gêmeos, mas que suportem um conjunto comum de funções, em torno do qual implementações específicas podem ser formadas.

Uma boa analogia seria um automóvel. A interface básica definida pelo “padrão” automóvel é:

Andar – pisar no acelerador
Parar – pisar no freio
Mudar de direção – girar o volante
Dar partida – girar a chave

Os automóveis que suportam essas interfaces padrão podem ser projetados com muitas implementacões diferentes. Por exemplo, o automóvel poderia ter um motor elétrico ou a gás, porém pisar no acelerador faria qualquer modelo se mover.

Um efeito colateral interessante dessa filosofia é que será possível aos sistemas operacionais que não sejam UNIX atenderem aos padrões definidos ao suportar as interfaces recomendadas.

Modularidade

O ambiente de computação está continuamente mudando e crescendo. Os padrões devem ser extensíveis. Devem ser capazes de absorver os avanços da tecnologia e a demanda dos usuários.

Os padrões estão sendo definidos de modo modular, de maneira que possam ser adicionados ou substituídos quando surgir uma lnterface melhor.

System V lnterface Definition da AT&T (SVID)

A AT&T foi a primeira empresa a desenvolver um padrão no ambiente operacional do sistema UNIX. Esse padrão, baseado no System V da empresa, concentra-se na interface de nível de função para o sistema operacional (chamadas do sistema), comunicação de interprocesso, o shell do sistema UNIX e alguns utilitários básicos.

A AT&T também desenvolveu a System V Verification Suite (SVVS) para verificar a conformidade ao SVID.

Embora a SVID tenha sido a primeira tentativa proprietária de desenvolver um padrão, o padrão não é independente do fabricante, visto que a AT&T é o “corpo” definitivo. Por exemplo, na Versão 3 do System V (System V.3), a AT&T exigiu qualificações tão rígidas para implementações que desejavam o endosso do System V.3, que algumas extensões oriundas de Berkeley não conseguiram conformidade ao System V.3.

IEEE/POSIX

O Institute of Eletrictal and Electronics Engineers (IEEE) patrocina a Portable Operating System lnterface para ambientes de computação (POSIX). O POSIX teve origem no Padrão /usr/group de 1984 cujo objetivo era definir padrões além do SVID (/usr/group é o antecessor do UniForum). O POSIX 1003 foi elaborado para desenvolver os padrões para todo o ambiente operacional, não apenas para a interface kemel. Diferentemente da AT&T, o POSIX define uma interface de programação sem definir a implementação. Portanto, sistemas conforme o POSIX podem ser desenvolvidos sem derivação do código AT&T.

O POSIX também foi submetido a ISO para inclusão no padrão internacional. Ele é associado com o protocolo TC22 WG 15.
Para fazer avançar o desenvolvimento do padrão, o POSIX foi dividido em vários componentes, com um grupo de trabalho nomeado para cada um:

1003.1 lnterface de sistema (formado em 1981).
Provê uma interface programática, de código de fonte, submetida a uma linguagem de alto nível que facilita a portabilidade de aplicativos. O POSIX.1 é intimamente ligada a SVID Versão 2 (SVID2), porém também inclui recursos do BSD 4.3 e recursos adicionais não fornecidos por nenhuma dessas definições de lnterface.

1003.2 Shells e Utilitários (formado em 1984).
Define uma linguagem de comando de shell e utilitários interativos .

1003.3 Métodos de Teste (formado em 1986).
Define as exigências gerais para elaboração e administração de testes. Provê uma lista de assertivas mostrando exatamente o que deve ser testado no padrão POSIX. Esse grupo não elaborará as seqüências de testes, e o método de teste é de responsabilidade do criador.

1003.4 Tempo Real
4a – extensões de linha
4b – especificação independente de linguagem

1003.5 Ligação Ada ao POSIX

1003.6 Segurança

1003.7 Administração do sistema

1003.8 Redes

1003.9 Ligação FORTRAN ao POSIX

1003.10 Perfil de Execução de Aplicativo de supercomputação (AEP)

1003.11 AEP de processamento de transação

1003.12 Interfaces independentes de protocolo

1003.13 AEP de Tempo Real

1003.14 AEP de multiprocessamento

X/OPEN

X/Open é um consórcio internacional de informática compreendendo fornecedores de sistemas, usuários, integradores de sistemas e projetistas de software que se uniram para definir um Ambiente de Aplicativo Comum. A missão do grupo não é defmir novos padrões, mas selecionar, entre os padrões existentes, aqueles que irão assegurar portabilidade e interfuncionamento de aplicativos, e permitir que os usuários movimentem-se entre sistemas sem treimamento adicional. O X/Open tem sua origem no SVID, porém é um superset do POSIX. O Guia de Portabilidade do X/Open (XPG, atualmente na versão 4) inclui um conjunto de padrões relevantes que endereçam todo o ambiente de apllcativos.

Alguns elementos incluem:

Componente Padrão Definidor
Chamadas de sistema & Bibliotecas POSIX 1003.1
Comandos & Utilitários POSIX 1003.2
Linguagem C ANSI
Linguagem COBOL ANSI/ISO
Linguagem FORTRAN ANSI
Linguagem Pascal ISO
SQL ANSI
Gerenciador de Janelas X Wlndow System

American National Standards Institute (ANSI)

É a organização coordenadora de padrões voluntários dos Estados Unidos. O IEEE é uma comissão de padrões credenciada junto ao ANSI.

Internacional Standards Organization (ISO)

Coordena a adoção de padrões internacionais para sistemas de informação distribuída em um ambiente de sistemas abertos (um ambiente de sistemas heterogêneos em rede). Os desdobramentos mais notáveis têm sido na área de rede e na definição do modelo de referência de rede do Open Systems lnterconnection (OSI) de sete camadas.

Os participantes da ISO geralmente vêm de organizações de padronização nacionais dos países membros. Nos Estados Unidos, o ANSI participa da ISO.

National Institute of Standards and Technology/ Federal Information

Padrão de Processaniento (NIST/FIPS)

O NIST era originalmente o National Bureau of Standards (NBS) e está subordinado ao Departamento de Comércio. Essa organização está desenvolvendo requisitos de padronização para agências governamentais. Sua missão original era avaliar os padrões POSIX.1 propostos, e o Federal Information Processlng Standard (FIPS) resultante incorporou o POSIX, além de recursos adicionais que o POSIX.1 considerou opcionais ou não especificou.

Esses órgãos estão também examinando os outros componentes de POSIX à medida que tomam-se disponíveis.

Comandos Básicos

who – este comando verifica quais são os usuários que estão logados ao sistema
Sintaxe: who [am i]
Opção:
•am i: indica com que conta está logado
Exemplos:
exemplo% who
exemplo% who am i

Passwd – este comando é usado para trocar a senha do usuário
Sintaxe: passwd [-fs] [username]
Opções:
•f: troca o nome completo associado ao usuário
•s: troca o shel do usuário
Exemplo:
exemplo% passwd

ls – lista o conteúdo de diretórios
Sintaxe: ls [-adFglt] filename
Opções (mais usadas):
•-a: lista todos os arquivos, inclusive os precedidos de `.’
•-d: se o filename for um diretório, lista só seu nome
•-F: põe caracteres especiais após diretórios, executáveis e links
•-g: lista o grupo do arquivo
•-l: lista no formato completo, ou seja, com todas as informações
•-t: ordena por ordem cronológica de criação
Exemplo:
exemplo% ls -la
exemplo% ls -tF

cat – concatena e apresenta arquivos
Sintaxe: cat [-n] [filename…]
Opção:
•-n: precede cada linha com o seu número
Exemplo:
exemplo% cat /etc/hosts
exemplo% cat hosts1 hosts2 > hosts3

cd – troca de diretório
pwd – apresenta o diretório corrente
Sintaxe:
cd [directory]
pwd
Exemplo:
exemplo% cd
exemplo% cd /var/log
exemplo% cd $OPENWINHOME
exemplo% pwd

cp – copia arquivos
Sintaxe:
cp [-ir] filename1 filename2
cp -rR [-ip] directory1 directory2
cp [-iprR] filename… directory
Opções:
•-i: interativo
•-r: recursivo
•-p: preserva
Exemplos:
exemplo% cp /etc/hosts etc/hosts.old
exemplo% cp -ir /etc etc
exemplo% cp -p /var/log log

ln – faz links físicos ou simbólicos a arquivos
Sintaxe:
ln [-s] filename [linkname]
ln [-s] pathname… directory
Opção:
•-s: cria link simbólico
Exemplo:
exemplo% ln -s

mkdir e rmdir – cria e remove diretórios
Sintaxe:
mkdir dirname…
rmdir dirname…
Obs.: mkdir requer permissão de escrita no diretório pai e rmdir só remove diretórios vazios

mv – move ou renomeia arquivos
Sintaxe:
mv [-fi] filename1 filename2
mv [-fi] directory1 directory2
mv [-fi] filename… directory
Opções:
•-f: força
•-i: interativo
Exemplo:
exemplo% mv velho novo
exemplo% mv -i teste1 teste2 teste3 teste
exemplo% mv -f teste1 teste2 teste3 teste

rm – remove arquivos ou diretórios
Sintaxe: rm [-fir] filename…
Opção:
•-r: recursivo
Exemplo:
exemplo% rm -i teste1 teste2
exemplo% rm -fr teste

more – exibir arquivos uma tela por vez
Sintaxe: more [filename]
Exemplos:
exemplo% more teste
exemplo% ls -la | more

find – encontra arquivos
Sintaxe: find pathname-list expression
Operadores:
•-name filename
•-user userid
•-group groupid
•-mtime n (Verdadeiro se o arquivo tiver sido modificado em “n” dias) •-ctime n (Verdadeiro se o arquivo tiver sido “alterado” em “n” dias. Alterdo significa que o arquivo foi modificado ou algum atributo do mesmo foi alterado) •-newer file (verdadeiro se o arquivo corrente tiver sido modificado mais recentemente que o parametro file)
•-print
•-exec op {};
•-ok {}; (equivalente ao -exec, mas pede confiramcao)
expressions:
•!: not
•-o: or
•-a: and (implicita pela justaposicao de duas expressoes)
Exemplos:
exemplo% find /home/penta/anonymous -name rfc* -print
exemplo% find . -name ´*teste*´ – print
exemplo% find /usr ( -name ´test*´-o -name ´tst*´ ) -print
exemplo% find . !-user Moe -print
exemplo% find . !-user usuario -exec rm {} ;

grep – procura pela ocorrência de uma string ou expressão regular em um arquivo
Sintaxe: grep [-cinv] [expression] [filename..]
Opções:
•-i: ignora letras
•-n: número da linha
•-c: número de ocorrências
•-v: inverte a busca
Exemplos:
exemplo% grep `RNP’ telephone.list
exemplo% grep -v `051′ telephone.list

lpr – envia um job à impressora
Sintaxe: lpr [-Pprinter] [-#copies] [-h] [-m] [filename…]
Opções:
•-Pprinter: envia para impressora chamada printer.
•-#copies: impreme o número de cópias indicado para cada arquivo
•-h: suprime a página de cabeçalho
•-m: envia mail ao terminar
Exemplos:
exemplo% lpr -Plw -#3 rel.ps
exemplo% lpr -Pps -h -m cv.ps proposta.ps

lpq – apresenta a fila de jobs de uma impressora
Sintaxe: lpq [-Pprinter] [-l]
Opções:
•-l: apresenta informação mais completa dos jobs na fila da impressora (host de origem)
Exemplo:
exemplo% lpq -Plw -l

lprm – remove jobs da fila da impressora
Sintaxe: lprm [-Pprinter] [-] [job# …]
Opções:
•-: remove todos seus jobs
•job#: remove os jobs indicados por seus números
Exemplo:
exemplo% lprm -Plw –
exemplo% lprm -Plw 234 398

lp – envia requisições à impressora
Sintaxe: lp [-mw] [-ddest] [-n#] filename…
Opções:
•-w: escreve mensagem no terminal do usuário
•-ddest: impressora destino
Exemplo:
lp -m -dlw rel.ps

lpstat – mostra estado do sistema de spooling das impressoras
Sintaxe: lpstat [-d] [-r] [-s] [-t] [-ulist]
Opções:
•-d: informa o destino default
•-r: informa o estado do escalonador
•-s: sumário com estado do escalonador, destino default e uma lista de impressoras com seus dispositivos associados
•-t: informa todas as informações de estado
•-ulist: informa as requisições de usuários na impressora default
Exemplos:
exemplo% lpstat -t
exemplo% lpstat -d
exemplo% lpstat -u `user1, user2, user3′

mail – correio eletrônico
Sintaxe:
mail [-f] [mailbox]
mail [recipient…]
Opção:
•-f: abre um arquivo de mail especificado por mailbox
Exemplos:
exemplo% mail
exemplo% mail -f mbox
exemplo% mail user@máquina.domínio

chmod – troca as permissões de acesso de um arquivo ou diretório
Sintaxe:
chmod [-R] mode filename
chmod [who] op permission [op permission] filen…
Exemplo:
exemplo% chmod o-w file
exemplo% chmod go+rx directory
exemplo% chmod 600 file
exemplo% chmod +x file
exemplo% chmod +rw directory/*

ps – lista os processos
Sintaxe: ps [-agx]
Opções:
•-a: inclui informações de processos de outros users
•-g: mostra todos os processos
•-x: inclui processos não controlados por terminais
•-e: imprime informacoes sobre todos processos em execucao
•-f: gera listagens completas
Exemplos:
exemplo% ps -ax
exemplo% ps -ef (SV)

finger – apresenta informações sobre usuários
Sintaxe: finger [-l] username
Exemplo:
exemplo% finger joao

groups – imprime os grupos aos quais um usuário pertence
Sintaxe: groups [username…]
Exemplo:
exemplo% groups
exemplo% groups user1 user2

kill – envia um sinal a um processo ou termina um processo
Sintaxe:
kill [-signal] pid…
kill -l
Opções:
•-l: apresenta uma lista de sinais
•-9: termina um processo
•-HUP: envia sinal de hangup
Exemplos
exemplo% kill -9 2345 3412 2126
exemplo% kill -HUP 5

sort – ordena a entrada
Sintaxe: sort [-dfn] filename…
Opções:
•-d: ordem de dicionário
•-f: ignora diferença enre maiúsculo e minúsculo
•-n: ordenação numérica
Exemplo:
exemplo% ls | sort -f

last – indica o último login de usuários
Sintaxe: last [-f filename] [name…]
Opções:
•-f: usa filename como o nome do arquivo de contabilidade ao invés de /var/adm/wtmp
Exemplo:
exemplo% last user | more

file – determina o tipo de um arquivo
Sintaxe: file filename…
Tipos reconhecidos:
•Texto ASCII
•Executável binário
•Fonte C
•Shell script
Exemplos:
exemplo% file /etc/host
exemplo% file *

whereis – localiza um arquivo binário, fonte ou página de manual
Sintaxe: whereis [-bms] filename…
Opções:
•-b: localiza somente arquivos binários
•-m: localiza somente páginas de manual
•-s: localiza somente fontes

which – localiza um comando apresentando seu pathname completo ou alias
Sintaxe: which [filename]
Exemplos:
exemplo% which ll
exemplo% which ps

write – escreve uma mensagem para outro user
Sintaxe: write username
Exemplo:
exemplo% write user

rusers – apresenta uma lista dos usuários loga- dos em máquinas locais
Sintaxe: rusers [-ail]
Opções:
•-a: Da reports de máquinas mesmo que não tenha alguem logado
•-i: ordena por tempo idle
•-l: apresenta uma lista no formato do comando who
Exemplo:
exemplo% rusers -ail

compress – (des)comprime arquivos
Sintaxe:
compress [-v] [filename…]
uncompress [-v] [filename…]
Opção:
•-v: apresenta a percentagem de compressão
Exemplo:
exemplo% compress -v *.c *.h

head – exibe as primeiras linhas de um arquivo
Sintaxe: head [-n] [filename…]
Opção:
•-n: número de linhas a exibir
Exemplo:
exemplo% head src/*.c
exemplo% head -20 bookmarks

tail – exibe o final de um arquivo
Sintaxe: tail [+|- n] filename
Opções:
•-n: exibe as últimas n linhas •+n: exibe da linha n até o final do arquivo
Exemplos:
exemplo% tail -30 /var/log/userlog
exemplo% tail +100 /var/log/login

talk – estabelece uma comunicação com outro usuário remoto ou local
Sintaxe: talk username
Exemplos:
exemplo% talk maria
exemplo% talk maria@hostname.domainname.br

diff – compara dois arquivos
Sintaxe: diff [-i] [-c[#]] file1 file2
Opções:
•-i: ignora diferença entre maiúsculas e minúsculas
•-c#: produz uma lista de diferenças com as linhas do contexto
Exemlos:
exemplo% diff -c5 relat1.txt relat2.txt

cmp – comparação binária entre dois arquivos
Sintaxe: cmp file1 file2
Exemplo:
exemplo% cmp exec1 exec2

wc – conta o número de linhas, palavras ou ca-racteres de um arquivo
Sintaxe: wc [-lwc] filenames…
Opções:
•-l: linhas
•-w: palavras
•-c: caracteres
Exemplo:
exemplo% wc -l .cshrc

df – reporta o espaço livre em um filesystem
Sintaxe: df [-a] [-i] [filesystem]
Opções:
•-a: reporta sobre todos filesystems
•-i: reporta o número de inodes usados e livres
Exemplo:
exemplo% df
exemplo% df -i /

du – mostra o número de blocos utilizados por diretório ou arquivo
Sintaxe: du [filename…]
Exemplo:
exemplo% du

Conclusão

Até hoje as variaveis do UNIX são utilizadas por um grande número de usuários à nivel mundial, em um conjunto de aplicações e configurações de hardware bastante amplo. O problema que ocorria consistia no fato de que, as aplicações, sendo exercitandas em diferentes variações de UNIX, embora na mesma arquitetura de máquina, não eram totalmente compativeis. Para solucionar este problema, visando transformar o UNIX em um produto padrão de industria, a AT&T e a MICROSOFT firmaram um acordo em fevereiro de 1987, onde o XENIX 2.3 e o UNIX SYSTEM V.3.2 foram agrupados em uma versão UNIX System V.3.2, compatibilizando as aplicações executadas em máquinas com processadore Intel 80386. Para completar o ciclo de compatibilidade das variações do UNIX, a versão 4.3 de BSD é agrupada ao System V.3.2, resultando na versão System V.4 em 1990.

DEIXE UMA RESPOSTA

Por favor digite seu comentário!
Por favor, digite seu nome aqui