Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <stdlib.h>
- #include <time.h>
- #include <signal.h>
- #include <errno.h>
- #define tamanio 1024
- // Manejador de senal (SIGCHLD)
- static void mimanejador(int senal){
- pid_t pid;
- char fifoproxy[tamanio];
- pid = wait(NULL);
- }
- int main(int argc, char **argv){
- pid_t pid, mipid;
- int estado;
- int fifoe, fifos, mififo;
- int bloqueo, resultado;
- char nombrefifoe[tamanio],
- nombrefifos[tamanio],
- nombreproxy[tamanio];
- char buffer[tamanio];
- if(argc != 2){
- printf("Uso del programa: <nombre_fifo>\n");
- exit(-1);
- }
- sprintf(nombrefifos,"%ss", argv[1]);
- sprintf(nombrefifoe,"%se", argv[1]);
- if(signal(SIGCHLD,mimanejador) == SIG_ERR)
- perror ("Servidor: Error configurando senal");
- //Creacion de fifos
- umask(0);
- if(mkfifo(nombrefifoe,0666) == -1){
- perror("Servidor: Error al crear el fifo entrada");
- exit(-1);
- }
- if(mkfifo(nombrefifos,0666) == -1){
- perror("Servidor: Error al crear el fifo salida");
- exit(-1);
- }
- //Apertura de fifos
- if(fifoe=open(nombrefifoe,O_RDWR) < 0){
- perror("Servidor: error al abrir fifo entrada");
- exit(-1);
- }
- if(fifos=open(nombrefifos,O_RDWR) < 0){
- perror("Servidor: error al abrir fifo salida");
- exit(-1);
- }
- umask(0);
- if(bloqueo = creat("bloqueo", S_IRUSR|S_IWUSR) < 0){
- perror("Servidor: Error al crear el archivo de bloqueo");
- exit(-1);
- }
- printf("Servidor: Esperando a clientes\n");
- while(read(fifoe,&buffer,tamanio) != 0){
- if ((pid = fork()) == -1) {
- perror ("Servidor: Problema al crear proceso proxy");
- exit(1);
- }
- if (pid == 0) {
- mipid=getpid();
- printf("Servidor: Creado proxy PID %d \n", mipid);
- sprintf(nombreproxy,"fifo.%d",mipid);
- if ((resultado = write(fifos, &mipid, sizeof(pid_t))) == -1){
- perror ("Servidor: ERROR AL ESCRIBIR EN EL FIFO SALIDA");
- exit(-1);
- }
- printf("Servidor: Se escribe PID %d en fifo salida\n", mipid);
- if(mkfifo(nombreproxy,0666) == -1){
- perror("Servidor: Error al crear el fifo proxy");
- exit(-1);
- }
- if(mififo=open(nombreproxy,O_RDONLY,0666) < 0){
- perror("Servidor: error al abrir fifo salida");
- exit(-1);
- }
- dup2(mififo,0);
- if(execlp("./proxy", "proxy", NULL) == -1){
- perror("Servidor: error al ejecutar ./proxy");
- exit(-1);
- }
- close(mififo);
- unlink(nombreproxy);
- exit(0);
- }
- }
- // El proceso original elimina zombies ya que es el padre.
- while (wait(&estado)!=-1);
- close(fifoe);
- close(fifos);
- unlink(nombrefifos);
- unlink(nombrefifoe);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement