Sistemas operativos
O trabalho da shell é repetitivo. Basicamente, consiste em: * pedir um comando (fazendo aparecer o "pronto" ....>); * ler e interpretar o comando; * executar o comando (ou dar erro, se o comando for inválido) e repetir, fazendo reaparecer o "pronto" para pedir um novo comando.
*Fork():
Fork serve para criar um processo filho apartir do processo pai por exemplo:
int a,n; a=3; n=fork(); if(n==0){ a=a+1; printf("FILHO:%d",a); }else{ a=a+2; printf("PAI:%d",a);
}
Output:
FILHO:4
PAI:5
A notar que o int a , no inicio era 3 e quando se faz o fork, esse int e alterado de forma difrente nos dois processos no pai, e incrementado mais 2 e no filho mais 1
*Sinais: os sinais sao metedos de comunicar com processos difrentes, e existem varios tipos de sinais a enviar.
SIGKILL - Mata o processo
SIGINIT - Inicia o processo
SIGIGN - Ignora o sinal
SIGUSR1 - Sinal 1
para armar o sinal, ou seja para preparar um sinal podemos usar duas maneiras o kill ou o signal, por exemplo:
kill(SIGKILL,getpid()); mata o proprio processo, pois o kill arma o sinal SIGKILL que termina o processo do getpid(), que neste caso é o proprio porcesso
outro exemplo: void handler(int sinal){ printf("RECEBI O SINAL %d",sinal);
}
main(){ signal(SIGUSR1,handler);
}
este sinal é enviado e chama o handler que nao é mais que um printf do recebi um sinal
*Sleep, Wait sleep(5) o que faz e ficar "suspenso" durante 5 segundos, ou seja passado esses 5 segundos o programa volta a a sua execuçao normal. wait() mantem o programa suspenso ate que alguma coisa aconteça por exemplo a receçao de um sinal
FILA DE MENSAGENS
*Criaçao:
msgid = msgget(ID*,TAMANHO**,IPC_CREATE | 0600 ***);
*ID deve ser um ID unico entre 1000 e 9999
**Tamanho maximo que a msg deve ter, por exemplo por norma é usado estruturas, por exemplo numa estrutura de fila de mensagem struct typedef{ char mensagem[20] ; long tipo;}
*** Caso a msg seja criada