Programacion en C linux. Procesos padres e hijos y señales.

rub6n
por el 08/08/2011
Hola programadores! Alguien podria echarme una mano con este ejercicio??


/*Realice un programa en c que lance un proceso hijo. Este proceso debe mostrar el mensaje "han
pasado N segundos" cada 5 segundos, reemplazando N por el numero de segundos transcurridos desde el lanzamiento del programa. Cuando el usuario presione CTRL+C el padre debe escribir el mensaje
"Fin del cronometro", matar al hijo y escribir su estado de fianlizacion "Estado del hijo:
ESTADO". Solo se pueden usar llamadas al sistema, incluyendo la escritura de mensajes por pantalla*/

Lo que yo he hecho es esto:
#include
#include
#include

int contador = 0;
int bucle=1;
int pid, status;

void manejador(int signum){
contador += 5;
printf("Han transcurrido %d segundos\n", contador);
}

void cortar();

void main(){
pid_t getpid(), getppid();
pid=fork();

if(pid==-1){
printf("No se puede crear procesos");
}else{
if(pid==0){
signal(SIGINT,cortar);
if (signal(SIGALRM, manejador) == SIG_ERR){
perror("fallo en signal");
exit(EXIT_FAILURE);
}
while(bucle){
alarm(5);
pause();
}
pause();
}
}
wait(&status);
kill(getpid(),SIGKILL);
printf("Hijo terminado con estado %d", getpid());
}

void cortar(){
signal (SIGINT, SIG_IGN);
printf ("Has pulsado CTRL-C\n");
signal (SIGINT, cortar);
bucle=0;
}

No se me da muy bien programar en c en linux... Es un ejercicio que tengo que entregar en septiembre de este año para poder rcuperar una asignatura que me quedo pendiente.
En lo que yo hago me funciona bien la captura de alarma, y la de capturar SIGINT a medias, ya que me muestra el mensaje por pantalla pero no lo hace bien del todo... Y lo de mostrar el mensaje que tendria que salir de "Proceso hijo acabado..." no me muestra nada, y de hecho creo que de esa parte cuando sale del if no me hace nada...
Alguien tiene alguna idea??
Por favor, ya se que no es cuestion de exigir, pero pediria las explicaciones lo mas sencillas posibles, ya que insisto que este tipo de programacion no se me da bien...

Gracias desde ya :)
Subir
OFERTAS Ver todas
  • -29%
    UA Apollo x6 Gen2 Essentials+
    2.699 €
    Ver oferta
  • -30%
    Behringer X32 Producer
    1.055 €
    Ver oferta
  • -9%
    ADJ myDMX5
    398 €
    Ver oferta
xurxoham
por el 12/08/2011
Hola, he echado un vistazo superrápido y he visto que
Alguien escribió:
printf("Hijo terminado con estado %d", getpid());
no tiene salto de línea. Recuerda que hasta que no se encuentra un salto de línea no se vacía el buffer y no aparece en pantalla.
Lo mismo ocurre con
Alguien escribió:
printf("No se puede crear procesos");


Por lo demás, te recomiendo que hagas tabulaciones a la hora de escribir código, simplifica muchísimo la lectura, ya que si no tienes que andar fijandote dónde empieza y termina un bloque {} lo que es un poco incómodo.

Sé que no es gran cosa lo que he dicho pero ahora mismo estoy en windows y no tengo el portátil a mano. Un saludo!
Subir
Nuevo post

Regístrate o para poder postear en este hilo