viernes, 11 de octubre de 2013

proceso zombie, daemon ,normal


creación de procesos zombie, daemon, normal

#include
#include

#include
#include

#include


void EjecutaMenu(int *opcion);
void VerificaCreacionZombie();
void VerificaCreacionDaemon();
void verificaProceso();
void VerMenu();

void VerMenu()
{
int opcion;

printf("\n\n\tMENU DE OPCIONES\n");
printf("\n\t-------------------------");
printf("\n\t 1-> Crear proceso zombie");
printf("\n\t 2-> Crear proceso daemon");
printf("\n\t 3-> Crear proceso normal");
printf("\n\t 4-> Verificacion de proceso zombie");
printf("\n\t 5-> Verificacion de proceso daemon");
printf("\n\t 6-> Verificacion de proceso normal");

printf("\n\n\t opcion:");

do
{
scanf("%d",&opcion);

if(opcion < 0 || opcion > 3)
{
//System("clear");
printf("\n\n\t*** INGRESE UNA OPCION VALIDA ENTRE 1 Y 10 ***");
//ImprimeMenu();
}
}
while(opcion < 0 || opcion > 6);

EjecutaMenu(&opcion);

}

void EjecutaMenu(int *opcion)
{

switch(*opcion)
{

case 1: // creacion de proceso zombie ...

{
pid_t pid; // pid_t es de tipo nativo de unix ,es como un entero
pid = fork();

int opcion;
int Menu1;
do{
int CONT = 0;

if(pid < 0) // error { printf("Error al crear proceso hijo,\n"); return (-1); } if(pid == 0) //creacion del proceso hijo { printf("\n\tSoy el hijo y mi PId es :%d \n", getpid()); CONT++; } else { printf("\n\tSoy el padre y mi PID es : %d \n",getpid()); while(1); } }while(CONT== 0) printf("\n\tproceso zombie creado presione 1 para ir al menu"); scanf("%d",Menu1); if(Menu1 == 1) { VerMenu(); } break; } case 2: { //creación de proceso tipo demonio // Los identificadores de procesos. pid_t pid, sid; // Se crea un proceso hijo (concurrente). pid = fork(); // Se verifica que se haya creado satisfactoriamente. if (pid < 0) { exit(EXIT_FAILURE); } else if (pid > 0)
{
// Si es el proceso padre, se sale del programa
printf("se creo el proceso hijo\n");

exit(EXIT_SUCCESS);
}
// Usando setsid, separa el proceso y pone el demonio dentro
// una nueva sesion

sid = setsid(); // crea una nueva sesion usuario
if (sid < 0) { exit(EXIT_FAILURE); } else if (sid > 0)
{
printf("inicia nueva seccion\n");
}
// A partir de aqui comienza el codigo del demonio
while (1)
{
printf("Corriendo demonio este mensaje aparecera cada 5 segundos\n");
sleep(5);
}
exit(EXIT_SUCCESS);

break;
}

case 3: // proceso normal
{
pid_t pid1;
int satatus;

pid1 = fork();

if(pid1 < 0 )
{
exit (EXIT_FAILURE);
}
else if(pid1 == 0)
{
printf("Creacion de proceso hijo creado cuyo ID es : %d",getpid());

}
else
printf("creacion de Proceso padre cuyo ID es : %d ",getpid());
waitpid(pid1,&satatus,0); // esperando al primer hijos

break;
}
case 4: // aun no esta completado ...
{ // habia pensado crear los procesos en segundo plano ,, y luego ejecutar este codigo
// otra podria ser crear una función que se le pase el PID
void VerificaCreacionZombie()
{
int pid;
int rtn;
pid=fork();

if (pid==0)
{
rtn = execlp("/bin/sh","sh","-c","ps -el | grep 'Z'",(char *)0);
if (rtn==-1)
perror("exec");
}
}

}
break;
}
}

int main(int argc,char * argv[])
{
printf("\n\tBIENVENIDO ");
printf("\n\tVAMOS A CREAR TRES TIPOS DIFERENTES DE PROCESOS"VerMenu();
return (0);

}