[risolto][C/c++] invio segnale SIGUSR1 senza killare il proc

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
giorgiofoga
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 367
Iscrizione: domenica 3 ottobre 2010, 22:04
Desktop: unity - gnome fa lo stess
Distribuzione: dalla 10.04 alla 18.04 RT comprese
Località: padova

[risolto][C/c++] invio segnale SIGUSR1 senza killare il proc

Messaggio da giorgiofoga »

Come da titolo, vorrei inviare un segnale da shell al mio processo, senza che questo venga effettimante "ucciso".... da shell ora scrivo:

Codice: Seleziona tutto

kill -s SIGUSR1 1430
Per ricevere il segnale in C++ utilizzo semplicemente questo codice ...

Codice: Seleziona tutto

void handler_sig(int sig){
if (sig == SIGUSR1) {faccio le mie cose;}
}
il risultato che ottengo è che il mio processo viene invariabilmente ucciso. Il programma è scritto in C++, mentre il programma che nella versione definitiva dovrebbe inviare il segnale è scritto in C puro.

Ho sbagliato ad interpretare l'uso dei segnali?? .... oppure in C++ devo fare altro per ottenere il segnale?
Ultima modifica di giorgiofoga il lunedì 1 settembre 2014, 10:05, modificato 1 volta in totale.
giorgiofoga -- gfx -- btk

Codice: Seleziona tutto

  *****sudo apt-get install  bleachDeiNirvana *****  
ixamit
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 499
Iscrizione: giovedì 14 novembre 2013, 10:16

Re: [C/c++] invio segnale SIGUSR1 senza killare il processo

Messaggio da ixamit »

giorgiofoga ha scritto:

Codice: Seleziona tutto

void handler_sig(int sig){
if (sig == SIGUSR1) {faccio le mie cose;}
}
Ciao,
sarebbe opportuno mostrare la funzione per intero, perchè scrivere "faccio le mie cose" è un po' superficiale
per identificare il tuo problema.

Codice: Seleziona tutto

#include <stdio.h>
#include <unistd.h>
#include <error.h>
#include <signal.h>

volatile int sig=0;
void handler_sig(int s)
{
    sig = s;
}    

int main()
{
    struct sigaction sa;

    sa.sa_handler = handler_sig;
    sa.sa_flags = 0;
    sigemptyset(&sa.sa_mask);
    if (sigaction(SIGUSR1, &sa, NULL) == -1) {
        perror("sigaction");
        return -1;
    }

    unsigned int i=0;
    while(++i) {
        if (sig && printf ("**GOT SIG %d\n",sig)) 
            sig=0;
     
        printf("%2u Hello World!\n",i);
        sleep(1);
    }
    return 0;
}

Avatar utente
giorgiofoga
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 367
Iscrizione: domenica 3 ottobre 2010, 22:04
Desktop: unity - gnome fa lo stess
Distribuzione: dalla 10.04 alla 18.04 RT comprese
Località: padova

Re: [C/c++] invio segnale SIGUSR1 senza killare il processo

Messaggio da giorgiofoga »

prima di tutto grazie mille della risposta...

ma .... con facciolemiecose, intendevo che eseguiùo un pezzo di codice che non ha nulla a che fare con il segnale.... in particolarmodo al posto ddi facciolemiecose, semplicemente richiamo una funzione che accende un led in una gui. uso QT c++.

Semplicemente non ho mai usato signal.h e non avevo e non ho ora idea di cosa sbaglio .... ora come ora non capisco perchè il tuo codice non dovrebbe venire killato (non lo ho provato ma mi fido ciecamente) ed il mio si.
giorgiofoga -- gfx -- btk

Codice: Seleziona tutto

  *****sudo apt-get install  bleachDeiNirvana *****  
Avatar utente
giorgiofoga
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 367
Iscrizione: domenica 3 ottobre 2010, 22:04
Desktop: unity - gnome fa lo stess
Distribuzione: dalla 10.04 alla 18.04 RT comprese
Località: padova

Re: [C/c++] invio segnale SIGUSR1 senza killare il processo

Messaggio da giorgiofoga »

spiegazione sigaction mi rispondo da solo ..... ottimo link
giorgiofoga -- gfx -- btk

Codice: Seleziona tutto

  *****sudo apt-get install  bleachDeiNirvana *****  
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti