Ayuda con fork() y señales SIGUSR1

Iniciado por murrayxaiyan, 3 Mayo 2017, 04:10 AM

0 Miembros y 1 Visitante están viendo este tema.

murrayxaiyan

Hola me gustaria que me hechen una mano necesito crear un programa que a traves de una señal SIGUSR1 que se manda desde otra consola, en la consola original mostrar la hora, el problema que tengo es que me exijen que muestre el pid cambie pero me muestra siempre el mismo. Adjunto el codigo limpio para ver si me pueden ayudar con el tema de poner el fork() ya que cuando intento ponerlo se me pega en el mismo proceso y la idea es que el programa este siempre en espera de la señal SIGUSR1(por eso el while(1)).


Código (cpp) [Seleccionar]
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<time.h>




void sig_handler(int signo)
{
time_t rawtime;
time (&rawtime);
       printf("Hora actual es: %s", ctime (&rawtime));
printf("Listo para recibir la señal SIGUSR1.\n");

}

void main()
{

pid_t pid;
pid=getpid();
printf("Programa hora ejecutandose. PID=%d.\n", pid);
printf("Listo para recibir la señal SIGUSR1.\n");
signal(SIGUSR1, sig_handler);
while(1);

}

CalgaryCorpus

Invoca sleep al interior del while. Un while asi construido consumira toda la CPU.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

MAFUS

#2
Prueba con esto. Aviso que uso Linux Mint Mate 18.1 y no lleva xterm por defecto (y ahora me da un poco de pereza instalarlo), así que no sé que tal ira.

#define _XOPEN_SOURCE

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#include <time.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

void sig_handler(int signo)
{
   time_t rawtime;
   
   time(&rawtime);
   printf("PADRE.SIG_HANDLER: Hora actual es: %s", ctime (&rawtime));
}

void hilo_hijo() {
   pid_t ppid;
   pid_t pid;
   int terminal;
   char argumentos[255] = "-S";
   
   terminal = open("dev/ptmx", O_RDWR | O_NOCTTY);
   grantpt(terminal);
   unlockpt(terminal);
   dup2(0, terminal);
   dup2(1, terminal);
   dup2(2, terminal);
   strcat(argumentos, ptsname(terminal));
   pid = fork();
   if(pid == 0) {
       execl("xterm", argumentos);
       exit(0);
   }
   
   ppid = getppid();
   printf("HIJO: Mi padre PID=%d.\n", ppid);
   printf("HIJO: Voy a enviar un mensaje a mi padre...\n");
   kill(ppid, SIGUSR1);
   printf("HIJO: Hora de terminar.\n");
}

void hilo_padre(pid_t pid_hijo) {
   printf("PADRE: Programa hora ejecutandose. Mi hijo PID=%d.\n", pid_hijo);
printf("PADRE: Listo para recibir la señal SIGUSR1.\n");
signal(SIGUSR1, sig_handler);
wait(NULL);
   printf("PADRE: Hora de terminar.\n");
}

int main() {
pid_t pid;
   
pid = fork();
   
   switch(pid) {
       case -1:
           printf("ERROR: No se pudo generar el hilo\n");
           break;
       
       case 0:
           hilo_hijo();
           break;
       
       default:
           hilo_padre(pid);
           break;
   }
   fflush(stdout);
}