Informatica

Disponível somente no TrabalhosFeitos
  • Páginas : 6 (1296 palavras )
  • Download(s) : 0
  • Publicado : 13 de março de 2013
Ler documento completo
Amostra do texto
INSTITUTO SUPERIOR DE CIÊNCIAS DO TRABALHO E DA EMPRESA
Sistemas Operativos ETI - IGE

2º Semestre 2005/2006

Aula 3

Processos

1. Quando estamos a "dar comandos ao Unix" estamos na realidade a trabalhar com um programa, designado shell, que lê, interpreta e executa os nossos comandos. Como em todos os casos, para executar esse programa o SO criou um processo; tipicamente este processo é criadoquando fazemos login (ou criamos uma janela no ambiente gráfico) e termina quando fizermos logout (ou exit para fechar a janela). Para listar os processos em curso na máquina pode usar o comando ps. Este comando mostra várias propriedades do processo, como seja o utilizador, programa em execução etc. E mostra o número que identifica univocamente cada processo (pid - process id). Exemplo:experimente o comando ps Qual o pid do programa shell que tem em execução? 2. A maior parte dos comandos que damos à shell são na realidade programas. Por exemplo, o comando ls corresponde ao programa /bin/ls. Executar o comando é, na realidade, executar este programa. Assim, para executar o comando a shell lança um novo processo, processo esse que decorre enquanto o programa estiver em execução. Exemplo:a execução do comando ps faz aparecer pelo menos dois processos, a shell e o próprio ps que, enquanto está em execução, é ele próprio um processo. O comando ps tem inúmeras variantes (ver man ps). Por exemplo: ps -u User Permite ver todos os processos do utilizador em curso na máquina. Exemplo: abra outra janela para executar uma shell; veja nessa nova janela o número de processo de todas as shellem curso; Exemplo: execute o comando cat /etc/passwd | more quais os processos em curso enquanto este comando está em execução?

ISCTE – DCTI

Sistemas Operativos – Processos

Pág. 1

3. A shell é um programa conceptualmente simples: um ciclo, que aceita e executa comandos, até aparecer um comando que o manda terminar. #include main() { char s[100]; while ( 1 ) { printf ("comando-> ");gets(s); if ( !strcmp(s, "exit") ) exit(0); printf ("executar o comando %s\n", s); } } Exemplo: experimente pôr este programa em execução. Veja o respectivo número de processo noutra janela. 4. A função do SO getpid permite obter o número de um processo. Para usar a função deve incluir os ficheiros... (veja man getpid). Por exemplo: int n = getpid(); printf ("O meu número de processo é: %d\n",n); Exemplo: acrescentar um comando pid ao nosso esqueleto de shell #include main() { char s[100]; while ( 1 ) { printf ("comando-> "); gets(s); if ( !strcmp(s, "exit") ) exit(0); else if ( !strcmp(s, "pid") ) printf ("PID=%d\n", getpid()); else printf ("%s: command not found\n", s); } } 5. A função getppid() permite obter o número de processo do processo pai. Exemplo: execute o seguinteprograma e interprete o resultado. main() { printf ("P-PID=%d\n", getppid() ); } 6. Como se vê, a shell cria (que é como quem diz, pede o SO para criar) novos processos. Podemos fazer coisa semelhante através de um programa em C. A forma de criar um processo no Unix é peculiar: faz-se usando a função fork() que cria um novo processo à partida exactamemte igual ao original (seja, um clone). Exemplo:ISCTE – DCTI Sistemas Operativos – Processos Pág. 2

main() { printf ("Inicio\n"); fork(); printf ("Fim\n"); } A chamada à função fork() cria um clone do próprio processo, ou seja, a partir daí passa a haver um segundo processo (filho do processo original) que começa exactamente igual ao processo que o criou. Em particular, começa no ponto em que o original estava: depois do primeiro printf etendo como próxima instrução a executar o segundo printf. Daí que, ao executar o programa vão aparecer dois "Fim", um escrito pelo processo original e outro pelo filho criado pelo fork. 7. Os dois processos obtidos na sequência do fork são em tudo semelhantes, mas são desde logo processos diferentes, logo têm pid diferente. main() { printf ("ANTES PID=%d\n", getpid()); fork(); printf ("DEPOIS...
tracking img