Sistemas operativos

Disponível somente no TrabalhosFeitos
  • Páginas : 6 (1353 palavras )
  • Download(s) : 0
  • Publicado : 12 de abril de 2013
Ler documento completo
Amostra do texto
SINAIS E PROCESSOS
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 porexemplo:

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 variostipos 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 porcessooutro 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 programasuspenso 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 criadano ID, nao sera necessario fazer o IPC_CREATE | ficara entao a criaçao shmget(ID,TAMANHO, 0600 );
*Uso:
As filas de mensagens tem 2 tipos de usos a recepçao e o envio fazendo da estrutura mensagem:
typedef struct {
long tipo;
char mensagem[100];
}Mensagem;

Mensagem msg_enviar;
Mensagem msg_receber;

**Envio:
defenindo 1º a mensagem a enviar por exemplo:strcpy(msg_enviar.mensagem,'TESTE');
msg_enviar.tipo=5;
msgsnd(msgid,&msg_enviar,sizeof(msg_enviar.mensagem),0);
caso a estrutura Mensagem tivesse mais do que uma char por exemplo mensagem_dois seria assim:
msgsnd(msgid,&msg_enviar,sizeof(msg_enviar.mensagem)+sizeof(msg_enviar.mensagem_dois,0);

**Receçao:
na receçao ele so recebe pelo o tipo defenido pertendido por exemplomsgrcv(msgid,&msg_receber,sizeof(msg_receber.mensagem),5,0);
printf("Mensagem:%s",msg_receber.mensagem");
nota que no caso da mensagem recebida ele tem um 5 , ou seja basicamente o programa so recebe mensagens do tipo 5, caso a mensagem seja de outro tipo é ignorada por este programa

SEMAFOROS

*Criaçao:
semid = semget(ID*,NUMERO_SINAIS**,IPC_CREATE | 0600 ***);
exit_on_error(semid,"ERRO"); ---- exit ao erro verifica se semid <0 caso sim sai com erro!
*ID deve ser unico de modo a nao haver comflitos, de 1000 a 9999
** Numero de sinais criados no IPCS
*** Caso o sinal seja criado no ID, nao sera necessario fazer o IPC_CREATE | ficara entao a criaçao semget(ID,NUMERO_SINAIS, 0600 );
*Modificação:
podemos fazer o semctl () que basicamente faz com que o semaforo seja inicializado a um certo valor por exemplo:semctl(semid, 0 , SETVAL , 1 ) **** o ID do semaforo, 0 é o 1º sinal a mudar, o SETVAL é para defenir o valor desse sinal a 1, apartir deste momento o sinal esta a 1, logo sera uma região critica que nao passa se estiver 0 se estiver 1 passa, logo ser uma regiao critica do estilo DOWN | UP
**Down:
struct semfub DOWN = {0,-1,0};
semop(semid, &DOWN,1);
fazemos uma estrutura que sera as instruçoes que...
tracking img