#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <string.h>
#define MAX 128
//Cabeceras de métodos o funciones
void lectorEscritor1();
void lectorEscritor2();
void abanico1();
void abanico2();
void cadena1();
void cadena2();
//Programa principal
int main()
{
char m[1];
printf("Menú\n");
printf("1- Lector-escritor entre proceso hijo y padre\n");
printf("2- Lector-escritor con tubería con nombre\n");
printf("3- Abanico de procesos\n");
printf("4- Abanico en espera\n");
printf("5- Cadena de procesos mostrando PID y PPID\n");
printf("6- Cadena de procesos mostrando PID e hijo\n");
if(read(0, m, 1)==-1) { perror("Error en el read"); close(1); }
switch(atoi(m))
{
case 1:
lectorEscritor1();
break;
case 2:
lectorEscritor2();
break;
case 3:
abanico1();
break;
case 4:
abanico2();
break;
case 5:
cadena1();
break;
case 6:
cadena2();
break;
default:
printf("Error al introducir un número, cerrando el programa\n");
}
close(0);
}
//Lector escritor entre proceso padre e hijo
void lectorEscritor1()
{
printf("Ejecutando programa 1\n");
//Declaracion de variables
int tub[2], nbytes;
char mensaje[MAX];
pid_t hijo;
//Creamos la tubería
pipe(tub);
//Creamos el hijo
hijo=fork();
switch (hijo)
{
case -1: //Si se ha producido un error
perror("Error en el fork");
close(1);
break;
case 0: //Parte correspondiente al hijo
close(tub[0]);
do
{
nbytes=read(0, mensaje, MAX);
if(mensaje[nbytes-1]=='\n') mensaje[nbytes-1]=0; //Para eliminar el salto de renglón
write(tub[1], mensaje, strlen(mensaje));
} while(strcmp(mensaje, "Q")!=0);
close(tub[1]);
close(0);
break;
default: //Parte correspondiente al padre
close(tub[1]);
while( (nbytes=read(tub[0], mensaje, MAX))>0 && strcmp(mensaje, "Q")!=0 )
{
mensaje[nbytes]='\0'; //Para hacer que sólo lea hasta donde ha leído y no la basura que hay en el array
printf("Receptor: %d | %s\n", nbytes, mensaje);
}
close(tub[0]);
break;
}
close(0);
}
//Lector escritor con tubería con nombre
void lectorEscritor2()
{
printf("Ejecutando programa 2\n");
//Declaracion de variables
int fd, nbytes;
char mensaje[MAX];
pid_t hijo;
//Creamos el hijo
hijo=fork();
switch (hijo)
{
case -1: //Si se ha producido un error
perror("Error en el fork");
close(1);
break;
case 0: //Parte correspondiente al hijo
//Abrimos la tubería
fd=open("tub", O_WRONLY);
if(fd==-1)
{
perror("Error en la tubería");
exit(1);
}
do
{
nbytes=read(0, mensaje, MAX);
if(mensaje[nbytes-1]=='\n') mensaje[nbytes-1]=0; //Para eliminar el salto de renglón
write(fd, mensaje, strlen(mensaje));
} while(strcmp(mensaje, "Q")!=0);
close(fd);
close(0);
break;
default: //Parte correspondiente al padre
//Abrimos la tubería
fd=open("tub", O_RDONLY);
if(fd==-1)
{
perror("Error en la tubería");
exit(1);
}
while( (nbytes=read(fd, mensaje, MAX))>0 && strcmp(mensaje, "Q")!=0 )
{
mensaje[nbytes]='\0'; //Para hacer que sólo lea hasta donde ha leído y no la basura que hay en el array
printf("Receptor: %d | %s\n", nbytes, mensaje);
}
close(fd);
break;
}
}
//Abanico de procesos
void abanico1()
{
printf("Ejecutando programa 3\n");
//Declaración de variables
int n=2,i;
pid_t hijo;
//Vamos creando los hijos
for(i=0; i<n; i++)
{
hijo=fork();
if(hijo==0)
{
printf("Proceso %d con padre %d acaba de empezar en la posición %d\n", getpid(), getppid(),i+2);
break;
}
}
printf("El proceso %d ha terminado\n", getpid());
}
//Abanico de procesos en espera
void abanico2()
{
printf("Ejecutando programa 4\n");
//Declaración de variables
int n=2,i,ret;
pid_t hijo,estado;
//Vamos creando los hijos
for(i=0; i<n; i++)
{
hijo=fork();
if(hijo==0)
{
printf("Proceso %d con padre %d acaba de empezar en la posición %d\n", getpid(), getppid(),i+2);
exit(i+2);
break;
}
}
while((ret=wait(&estado))!=-1)
{
printf("El proceso %d ha terminado en la posición %d\n", ret, estado >> 8);
}
printf("El proceso padre %d ha terminado\n", getpid());
}
//Cadena de procesos mostrando padre
void cadena1()
{
printf("Ejecutando programa 5\n");
//Declaración de variables
int n=2,i,ret;
pid_t hijo,estado;
//Vamos creando los hijos
for(i=0; i<n; i++)
{
hijo=fork();
if(hijo>0)
break;
}
wait(NULL);
printf("Proceso con PID %d y padre con PPID %d\n",getpid(),getppid());
}
//Cadena de procesos mostrando hijos
void cadena2()
{
printf("Ejecutando programa 6\n");
//Declaración de variables
int n=2,i,ret;
pid_t hijo,estado;
//Vamos creando los hijos
for(i=0; i<n; i++)
{
hijo=fork();
if(hijo>0)
break;
}
ret=wait(NULL);
if(ret!=-1) printf("Proceso con PID %d y con hijo %d\n",getpid(),ret);
else printf("Proceso con PID %d no tiene hijos\n",getpid());
}
[/spolier]
Tienes ejemplos de lector-escritor con tubería anónima y una tubería normal.
Creación de procesos en abanico y cadena de procesos.
Vamos, un poco de todo lo que te pueden pedir este año (sin contar la parte de shell, que también tengo un resumen por si te interesa )
Saludos