Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: murrayxaiyan en 3 Mayo 2017, 04:10 am



Título: Ayuda con fork() y señales SIGUSR1
Publicado por: murrayxaiyan en 3 Mayo 2017, 04:10 am
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
  1. #include<stdio.h>
  2. #include<signal.h>
  3. #include<unistd.h>
  4. #include<time.h>
  5.  
  6.  
  7.  
  8.  
  9. void sig_handler(int signo)
  10. {
  11. time_t rawtime;
  12. time (&rawtime);
  13.        printf("Hora actual es: %s", ctime (&rawtime));
  14. printf("Listo para recibir la señal SIGUSR1.\n");
  15.  
  16. }
  17.  
  18. void main()
  19. {
  20.  
  21. pid_t pid;
  22. pid=getpid();
  23. printf("Programa hora ejecutandose. PID=%d.\n", pid);
  24. printf("Listo para recibir la señal SIGUSR1.\n");
  25. signal(SIGUSR1, sig_handler);
  26. while(1);
  27.  
  28. }
  29.  


Título: Re: Ayuda con fork() y señales SIGUSR1
Publicado por: CalgaryCorpus en 3 Mayo 2017, 07:10 am
Invoca sleep al interior del while. Un while asi construido consumira toda la CPU.


Título: Re: Ayuda con fork() y señales SIGUSR1
Publicado por: MAFUS en 3 Mayo 2017, 23:32 pm
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.

Código
  1. #define _XOPEN_SOURCE
  2.  
  3. #include <stdio.h>
  4. #include <sys/types.h>
  5. #include <sys/wait.h>
  6. #include <signal.h>
  7. #include <unistd.h>
  8. #include <time.h>
  9. #include <fcntl.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12.  
  13. void sig_handler(int signo)
  14. {
  15.    time_t rawtime;
  16.  
  17.    time(&rawtime);
  18.    printf("PADRE.SIG_HANDLER: Hora actual es: %s", ctime (&rawtime));
  19. }
  20.  
  21. void hilo_hijo() {
  22.    pid_t ppid;
  23.    pid_t pid;
  24.    int terminal;
  25.    char argumentos[255] = "-S";
  26.  
  27.    terminal = open("dev/ptmx", O_RDWR | O_NOCTTY);
  28.    grantpt(terminal);
  29.    unlockpt(terminal);
  30.    dup2(0, terminal);
  31.    dup2(1, terminal);
  32.    dup2(2, terminal);
  33.    strcat(argumentos, ptsname(terminal));
  34.    pid = fork();
  35.    if(pid == 0) {
  36.        execl("xterm", argumentos);
  37.        exit(0);
  38.    }
  39.  
  40.    ppid = getppid();
  41.    printf("HIJO: Mi padre PID=%d.\n", ppid);
  42.    printf("HIJO: Voy a enviar un mensaje a mi padre...\n");
  43.    kill(ppid, SIGUSR1);
  44.    printf("HIJO: Hora de terminar.\n");
  45. }
  46.  
  47. void hilo_padre(pid_t pid_hijo) {
  48.    printf("PADRE: Programa hora ejecutandose. Mi hijo PID=%d.\n", pid_hijo);
  49. printf("PADRE: Listo para recibir la señal SIGUSR1.\n");
  50. signal(SIGUSR1, sig_handler);
  51. wait(NULL);
  52.    printf("PADRE: Hora de terminar.\n");
  53. }
  54.  
  55. int main() {
  56. pid_t pid;
  57.  
  58. pid = fork();
  59.  
  60.    switch(pid) {
  61.        case -1:
  62.            printf("ERROR: No se pudo generar el hilo\n");
  63.            break;
  64.  
  65.        case 0:
  66.            hilo_hijo();
  67.            break;
  68.  
  69.        default:
  70.            hilo_padre(pid);
  71.            break;
  72.    }
  73.    fflush(stdout);
  74. }