Advertisement
Guest User

Untitled

a guest
Dec 15th, 2018
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "include.h"
  2.  
  3. typedef struct {
  4. int numero;
  5. char nome[50];
  6. char turma[10];
  7. char telemovel[15];
  8. char email[40];
  9. char tipo[20];
  10. char marca[20];
  11. char matricula[15];
  12. int viagens;
  13. int pontos;
  14. float saldo;
  15. int activo;
  16. long disponivel_desde;
  17. int PID;
  18. } Tcondutor;
  19.  
  20. Tcondutor c;
  21.  
  22. typedef struct {
  23. long tipo;
  24. struct {
  25. int pid_passageiro;
  26. int pid_condutor;
  27. char local_encontro[100];
  28. long data;
  29. float pontos;
  30. float valor;
  31. } dados;
  32. } MsgViagem;
  33.  
  34. MsgViagem msg1, msg3, msg4;
  35.  
  36. struct sembuf UP = {0, 1, 0};
  37. struct sembuf DOWN ={ 0, -1, 0};
  38.  
  39. void down(){
  40. int status=0;
  41. int sem_id=semget(23511, 1, 0);
  42. printf("vou fazer DOWN");
  43. status = semop(sem_id, &DOWN, 1);
  44. exit_on_error(status, "erro no Down");
  45. }
  46.  
  47. void up(){
  48. int status=0;
  49. int sem_id=semget(23511, 1, 0);
  50. status = semop(sem_id,&UP,1);
  51. exit_on_error(status, "erro no UP");
  52. printf("vou fazer up");
  53. }
  54. int num_condutores(){
  55. int i=0;
  56. int numero_condutores=0;
  57. char linha[100];
  58. char tmp[100];
  59.  
  60. FILE *f = fopen("condutores.txt","r");
  61. while (fgets(linha, 100, f) != NULL){
  62. numero_condutores++;
  63. }
  64. fclose(f);
  65. return numero_condutores;
  66.  
  67. }
  68.  
  69. void info_condutor(){
  70.  
  71. int estado=0;
  72. int sem_id=semget(23511, 1, 0);
  73. int id_cond = shmget(78456, num_condutores()*sizeof(Tcondutor), 0);
  74. Tcondutor* lista_cond = (Tcondutor*)shmat (id_cond, 0 ,0);
  75. char tmp[100];
  76. int tempo = (int) time(NULL);
  77. printf("Qual o numero de condutor: ");
  78. fgets(tmp,100,stdin);
  79. c.numero = atoi(tmp);
  80. int i;
  81.  
  82. for( i=0; i<num_condutores();i++){
  83. down();
  84. if(c.numero == lista_cond[i].numero){
  85. lista_cond[i].activo=1;
  86. lista_cond[i].disponivel_desde = tempo;
  87. lista_cond[i].PID = getpid();
  88. c.PID=getpid();
  89. printf("%d\n",c.PID);
  90. }
  91. up();
  92.  
  93. }
  94. }
  95.  
  96. void getmessage(){
  97. int id, estado;
  98. id = msgget (77676, 0);
  99. exit_on_error(id, "Erro no msgget");
  100. estado = msgrcv(id, &msg1, sizeof(msg1.dados),getpid(), 0);
  101. exit_on_error(estado, "erro ao receber");
  102.  
  103.  
  104. }
  105.  
  106. void recebemensagem2(){
  107. int id_cond = shmget (77676, num_condutores()*sizeof(Tcondutor), 0);
  108. Tcondutor* lista_cond = (Tcondutor*)shmat (id_cond, 0 ,0);
  109. int i;
  110. getmessage();
  111.  
  112. printf( "Pid do passageiro: %d\n", msg1.dados.pid_passageiro);
  113. }
  114.  
  115. void enviamsg3(){
  116. char tmp[100];
  117. int id, estado;
  118. id = msgget (78456, 0);
  119. exit_on_error(id, "Erro no msgget");
  120.  
  121.  
  122. msg3.tipo = msg1.dados.pid_passageiro;
  123. msg3.dados.pid_condutor = getpid();
  124. printf("Onde se encontra?");
  125. fgets(msg3.dados.local_encontro,100, stdin);
  126.  
  127. estado = msgsnd (id, &msg3, sizeof(msg3.dados),0);
  128. exit_on_error (estado, "erro ao enviar");
  129. printf("Mensagem 3 enviada\n");
  130. }
  131.  
  132.  
  133. void trata_mensagem(int sinal){
  134. int id_cond = shmget (77676, num_condutores()*sizeof(Tcondutor), 0);
  135. Tcondutor* lista_cond = (Tcondutor*)shmat (id_cond, 0 ,0);
  136. int i;
  137. int estado=0;
  138. int sem_id=semget(23511, 1, 0);
  139.  
  140. if(sinal == SIGINT){
  141. printf("O condutor nao se encontra de servico");
  142.  
  143. for( i=0; i<num_condutores();i++){
  144. down();
  145.  
  146. if(c.numero == lista_cond[i].numero){
  147. lista_cond[i].activo =0;
  148.  
  149. }
  150. up();
  151. }
  152. }
  153. }
  154.  
  155. void enviamsg4(){
  156. char tmp[100];
  157.  
  158. int id, estado;
  159. id = msgget (78456, 0);
  160. exit_on_error(id, "Erro no msgget");
  161. int tempo = (int) time(NULL);
  162.  
  163. msg4.tipo = 1;
  164. msg4.dados.pid_passageiro = msg1.dados.pid_passageiro;
  165. msg4.dados.pid_condutor = getpid();
  166. msg4.dados.data= tempo;
  167. printf("Qual o valor da corrida:");
  168. fgets(tmp,100,stdin);
  169. msg4.dados.valor = atoi(tmp);
  170. printf("Introduza a pontuacao da viagem (0 a 10):");
  171. fgets(tmp,100,stdin);
  172. msg4.dados.pontos = atoi(tmp);
  173.  
  174. 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);
  175.  
  176.  
  177. estado = msgsnd (id, &msg4, sizeof(msg4.dados),0);
  178. exit_on_error (estado, "erro ao enviar");
  179. printf("Mensagem 4 enviada\n");
  180.  
  181.  
  182. }
  183.  
  184.  
  185. int main(){
  186. int sem_id = semget (23511, 1, IPC_CREAT | 0666);
  187. exit_on_error (sem_id, "erro");
  188.  
  189. printf("Semaforo criado, id: %d\n", sem_id);
  190.  
  191. int status = semctl(sem_id, 0, SETVAL, 1);
  192. exit_on_error(status,"erro a iniciar");
  193. info_condutor();
  194. recebemensagem2();
  195. enviamsg3();
  196. signal(SIGINT, trata_mensagem);
  197. enviamsg4();
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement