Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C] Funzione pause()

  1. #1
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154

    [C] Funzione pause()

    Ola. Non capisco come mai il seguente programma non funzioni ma si blocchi dopo aver stampato il 2° printf (2 - Processo padre iniziato e in attesa). La mia opinione è che il segnale SIGCONT nella kill può (e viene) ignorato... Come posso forzare il figlio a ripartire?

    codice:
    #include <errno.h>       /* error definitions and routines */
    #include <stdlib.h>      /* C standard library */
    #include <unistd.h>      /* unix standard library */
    #include <stdio.h>       /* standard I/O library */
    #include <string.h>      /* string functions */
    #include <sys/types.h>
    #include <sys/wait.h>
    #include </usr/include/signal.h>  /* funzioni per i segnali*/
    
    main (int argc, char *argv[])
    {
    	int i, j, status;
    	pid_t pid;
    	unsigned long a;
    
    	pid = fork ();
    
    	if (!pid)
    	{
    		printf ("1 - Processo figlio in pausa\n");
    		pause();
    		printf ("3 - Processo figlio ripreso\n");
    		printf ("4 - Processo figlio terminato. Torno al padre\n");
    		exit(0);
    	} else
    	{
    	printf ("2 - Processo padre iniziato e in attesa\n");
    	sleep(2);
     	kill(pid, SIGCONT);
    	wait(NULL);
    	printf ("5 - Processo padre terminato. Uscita\n");
    	}
    	return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    che sappia io devi scrivere la routine per il catch del segnale. cioè devi dire al processo COSA fare quando riceve il segnale. però non mi ricordo il nome della syscall per fare ciò...
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  3. #3
    devi creare una funzione per gestire il cont
    codice:
    void trap(int sig) { /* non fa niente */ }
    e prima del fork aggiungere:
    signal(SIGCONT, trap);

    ora puoi usare
    kill(getpid(), SIGSTOP);
    al posto di pause()
    ma rischieresti che arrivi prima il SIGCONT al padre
    prima che il figlio faccia un SIGSTOP

    googlando ho trovato questo esempio che utilizza SIGUSR1
    codice:
       #include <stdio.h>
        #include <unistd.h>
        #include <signal.h>
    
        void trap(int sig) { /* do nothing */ }
    
        int main()
        {
            int pid;
    
            signal(SIGUSR1, trap);
            switch (pid = fork())
            {
            case 0:
                pause();
                puts("Child: received signal, exiting");
                break;
    
            case -1:
                perror("fork");
                return 1;
    
            default:
                puts("Parent: sleeping...");
                sleep(5);
                puts("Parent: sending signal");
                kill(pid, SIGUSR1);
                wait(0);
                puts("Parent: child exited");
            }
    
            return 0;
        }

  4. #4
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154
    Thx per l'aiuto. La funzione fa quello che vorrei
    Non capisco però perchè devo usare la signal(). La funzione pause() non blocca il processo corrente fino a che non riceve un segnale (appunto il SIGCONT che gli invio dal padre tramite la kill() )?

  5. #5
    http://www.gnu.org/software/libc/man...-Problems.html
    link in inglese..
    non e' un problema di funzione..
    e' un problema di tempo--
    se guardi il nodo dopo di dicono di usare sigsuspend()

  6. #6
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154
    Chiaro. Grazie 1000!
    Ciauz

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.