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

rub6n
#1 por rub6n 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
OFERTASVer todas
  • -40%
    Roland SPD-20 Pro BK Octapad
    398 €
    Ver oferta
  • -29%
    Sinte analógico de bajos Donner B1
    99 €
    Ver oferta
  • -13%
    Roland Juno-D6
    839 €
    Ver oferta
xurxoham
#2 por xurxoham 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
Hilos similares
Nuevo post

Regístrate o para poder postear en este hilo