Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "include.h"
- typedef struct {
- int numero;
- char nome[50];
- char turma[10];
- char telemovel[15];
- char email[40];
- char tipo[20];
- char marca[20];
- char matricula[15];
- int viagens;
- int pontos;
- float saldo;
- int activo;
- long disponivel_desde;
- int PID;
- } Tcondutor;
- Tcondutor c;
- typedef struct {
- long tipo;
- struct {
- int pid_passageiro;
- int pid_condutor;
- char local_encontro[100];
- long data;
- float pontos;
- float valor;
- } dados;
- } MsgViagem;
- MsgViagem msg1, msg3, msg4;
- struct sembuf UP = {0, 1, 0};
- struct sembuf DOWN ={ 0, -1, 0};
- void down(){
- int status=0;
- int sem_id=semget(23511, 1, 0);
- printf("vou fazer DOWN");
- status = semop(sem_id, &DOWN, 1);
- exit_on_error(status, "erro no Down");
- }
- void up(){
- int status=0;
- int sem_id=semget(23511, 1, 0);
- status = semop(sem_id,&UP,1);
- exit_on_error(status, "erro no UP");
- printf("vou fazer up");
- }
- int num_condutores(){
- int i=0;
- int numero_condutores=0;
- char linha[100];
- char tmp[100];
- FILE *f = fopen("condutores.txt","r");
- while (fgets(linha, 100, f) != NULL){
- numero_condutores++;
- }
- fclose(f);
- return numero_condutores;
- }
- void info_condutor(){
- int estado=0;
- int sem_id=semget(23511, 1, 0);
- int id_cond = shmget(78456, num_condutores()*sizeof(Tcondutor), 0);
- Tcondutor* lista_cond = (Tcondutor*)shmat (id_cond, 0 ,0);
- char tmp[100];
- int tempo = (int) time(NULL);
- printf("Qual o numero de condutor: ");
- fgets(tmp,100,stdin);
- c.numero = atoi(tmp);
- int i;
- for( i=0; i<num_condutores();i++){
- down();
- if(c.numero == lista_cond[i].numero){
- lista_cond[i].activo=1;
- lista_cond[i].disponivel_desde = tempo;
- lista_cond[i].PID = getpid();
- c.PID=getpid();
- printf("%d\n",c.PID);
- }
- up();
- }
- }
- void getmessage(){
- int id, estado;
- id = msgget (77676, 0);
- exit_on_error(id, "Erro no msgget");
- estado = msgrcv(id, &msg1, sizeof(msg1.dados),getpid(), 0);
- exit_on_error(estado, "erro ao receber");
- }
- void recebemensagem2(){
- int id_cond = shmget (77676, num_condutores()*sizeof(Tcondutor), 0);
- Tcondutor* lista_cond = (Tcondutor*)shmat (id_cond, 0 ,0);
- int i;
- getmessage();
- printf( "Pid do passageiro: %d\n", msg1.dados.pid_passageiro);
- }
- void enviamsg3(){
- char tmp[100];
- int id, estado;
- id = msgget (78456, 0);
- exit_on_error(id, "Erro no msgget");
- msg3.tipo = msg1.dados.pid_passageiro;
- msg3.dados.pid_condutor = getpid();
- printf("Onde se encontra?");
- fgets(msg3.dados.local_encontro,100, stdin);
- estado = msgsnd (id, &msg3, sizeof(msg3.dados),0);
- exit_on_error (estado, "erro ao enviar");
- printf("Mensagem 3 enviada\n");
- }
- void trata_mensagem(int sinal){
- int id_cond = shmget (77676, num_condutores()*sizeof(Tcondutor), 0);
- Tcondutor* lista_cond = (Tcondutor*)shmat (id_cond, 0 ,0);
- int i;
- int estado=0;
- int sem_id=semget(23511, 1, 0);
- if(sinal == SIGINT){
- printf("O condutor nao se encontra de servico");
- for( i=0; i<num_condutores();i++){
- down();
- if(c.numero == lista_cond[i].numero){
- lista_cond[i].activo =0;
- }
- up();
- }
- }
- }
- void enviamsg4(){
- char tmp[100];
- int id, estado;
- id = msgget (78456, 0);
- exit_on_error(id, "Erro no msgget");
- int tempo = (int) time(NULL);
- msg4.tipo = 1;
- msg4.dados.pid_passageiro = msg1.dados.pid_passageiro;
- msg4.dados.pid_condutor = getpid();
- msg4.dados.data= tempo;
- printf("Qual o valor da corrida:");
- fgets(tmp,100,stdin);
- msg4.dados.valor = atoi(tmp);
- printf("Introduza a pontuacao da viagem (0 a 10):");
- fgets(tmp,100,stdin);
- msg4.dados.pontos = atoi(tmp);
- printf("Tipo: %d,PID do passageiro %d,PID do condutor: %d,Pontuacao: %d,Valor= %.2f \n", msg4.tipo, msg4.dados.pid_passageiro, msg4.dados.pid_condutor, msg4.dados.pontos, msg4.dados.valor);
- estado = msgsnd (id, &msg4, sizeof(msg4.dados),0);
- exit_on_error (estado, "erro ao enviar");
- printf("Mensagem 4 enviada\n");
- }
- int main(){
- int sem_id = semget (23511, 1, IPC_CREAT | 0666);
- exit_on_error (sem_id, "erro");
- printf("Semaforo criado, id: %d\n", sem_id);
- int status = semctl(sem_id, 0, SETVAL, 1);
- exit_on_error(status,"erro a iniciar");
- info_condutor();
- recebemensagem2();
- enviamsg3();
- signal(SIGINT, trata_mensagem);
- enviamsg4();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement