Advertisement
Guest User

Untitled

a guest
Jan 18th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <stdlib.h>
  6. #include <time.h>
  7. #include <signal.h>
  8. #include <errno.h>
  9.  
  10. #define tamanio 1024
  11.  
  12. // Manejador de senal (SIGCHLD)
  13. static void mimanejador(int senal){
  14. pid_t pid;
  15. char fifoproxy[tamanio];
  16.  
  17. pid = wait(NULL);
  18. }
  19.  
  20. int main(int argc, char **argv){
  21. pid_t pid, mipid;
  22. int estado;
  23. int fifoe, fifos, mififo;
  24. int bloqueo, resultado;
  25. char nombrefifoe[tamanio],
  26. nombrefifos[tamanio],
  27. nombreproxy[tamanio];
  28. char buffer[tamanio];
  29.  
  30. if(argc != 2){
  31. printf("Uso del programa: <nombre_fifo>\n");
  32. exit(-1);
  33. }
  34.  
  35. sprintf(nombrefifos,"%ss", argv[1]);
  36. sprintf(nombrefifoe,"%se", argv[1]);
  37.  
  38. if(signal(SIGCHLD,mimanejador) == SIG_ERR)
  39. perror ("Servidor: Error configurando senal");
  40.  
  41. //Creacion de fifos
  42. umask(0);
  43. if(mkfifo(nombrefifoe,0666) == -1){
  44. perror("Servidor: Error al crear el fifo entrada");
  45. exit(-1);
  46. }
  47. if(mkfifo(nombrefifos,0666) == -1){
  48. perror("Servidor: Error al crear el fifo salida");
  49. exit(-1);
  50. }
  51.  
  52. //Apertura de fifos
  53. if(fifoe=open(nombrefifoe,O_RDWR) < 0){
  54. perror("Servidor: error al abrir fifo entrada");
  55. exit(-1);
  56. }
  57.  
  58. if(fifos=open(nombrefifos,O_RDWR) < 0){
  59. perror("Servidor: error al abrir fifo salida");
  60. exit(-1);
  61. }
  62. umask(0);
  63. if(bloqueo = creat("bloqueo", S_IRUSR|S_IWUSR) < 0){
  64. perror("Servidor: Error al crear el archivo de bloqueo");
  65. exit(-1);
  66. }
  67.  
  68. printf("Servidor: Esperando a clientes\n");
  69. while(read(fifoe,&buffer,tamanio) != 0){
  70. if ((pid = fork()) == -1) {
  71. perror ("Servidor: Problema al crear proceso proxy");
  72. exit(1);
  73. }
  74. if (pid == 0) {
  75. mipid=getpid();
  76. printf("Servidor: Creado proxy PID %d \n", mipid);
  77.  
  78. sprintf(nombreproxy,"fifo.%d",mipid);
  79.  
  80. if ((resultado = write(fifos, &mipid, sizeof(pid_t))) == -1){
  81. perror ("Servidor: ERROR AL ESCRIBIR EN EL FIFO SALIDA");
  82. exit(-1);
  83. }
  84. printf("Servidor: Se escribe PID %d en fifo salida\n", mipid);
  85.  
  86. if(mkfifo(nombreproxy,0666) == -1){
  87. perror("Servidor: Error al crear el fifo proxy");
  88. exit(-1);
  89. }
  90.  
  91. if(mififo=open(nombreproxy,O_RDONLY,0666) < 0){
  92. perror("Servidor: error al abrir fifo salida");
  93. exit(-1);
  94. }
  95. dup2(mififo,0);
  96.  
  97. if(execlp("./proxy", "proxy", NULL) == -1){
  98. perror("Servidor: error al ejecutar ./proxy");
  99. exit(-1);
  100. }
  101.  
  102. close(mififo);
  103. unlink(nombreproxy);
  104.  
  105. exit(0);
  106. }
  107. }
  108. // El proceso original elimina zombies ya que es el padre.
  109. while (wait(&estado)!=-1);
  110.  
  111. close(fifoe);
  112. close(fifos);
  113. unlink(nombrefifos);
  114. unlink(nombrefifoe);
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement