PDA

Visualizza la versione completa : [C] Programmino con Linux


aedesy
07-01-2013, 22:10
Salve a tutti. Devo scrivere il seguente programma in C su Linux. Deve ricevere in input due interi A e B. Se il processo riceve un segnale SIGUSR1 ne stampo la somma. Con SIGUSR2 ne stampo la differenza. Il programma esce con Ctrl^C. Ho sviluppato il codice nel seguente modo.


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

int a,b,somma,diff;

void handler(int sig){

if(sig==SIGUSR1)
printf("la somma è: %d\n",somma);
else if(sig==SIGUSR2)
printf("la differenza è: %d\n",diff);
}

void main(){

signal(SIGUSR1,handler);
signal(SIGUSR2,handler);

while(1){
printf("digita il numero a:\n");
scanf("%d",&a);
printf("digita il numero b:\n");
scanf("%d",&b);
somma=a+b;
diff=a-b;
printf("manda il segnale al processo %d\n",getpid());
pause();
}
}

All'invio del segnale mediante kill non succede nulla. Riesco solo a far terminare il programma con Ctrl^C. Devo ammettere che la materia mi risulta un pò ostica ma se non riesco a capire in che modo impostare un semplice esercizio come questo, non potrò andare agli step successivi. Spero che qualcuno mi possa far capire meglio come funzionano i processi e i segnali sotto Linux. Grazie.

c0der
07-01-2013, 22:55
Originariamente inviato da aedesy
<cut>
signal(SIGUSR1,handler);
signal(SIGUSR2,handler);
<cut>


Hai registrato un gestore per i segnali USR1 e USR2 quindi devi usare kill con:
$ kill -USR1 pid
$ kill -USR2 pid

Ciao.

aedesy
08-01-2013, 09:36
Grazie per la risposta. Infatti invoco la kill come da suggerimento ma non succcede nulla. Non capisco il perché :dhò:

c0der
08-01-2013, 10:15
Strano, a me funziona correttamente:



$ ./demo
digita il numero a:
10
digita il numero b:
20
manda il segnale al processo 2130
la somma è: 30
digita il numero a:
la differenza è: -10


da un'altra finestra digito:
$ kill -USR1 2130
$ kill -USR2 2130

Ciao.

aedesy
08-01-2013, 10:38
Vero. Se eseguo la kill da un'altra finestra il programma va. Ma è normale fare così? Perché non posso eseguire la kill dalla stessa finestra, quando invece Ctrl^C funziona?

c0der
08-01-2013, 10:45
Originariamente inviato da aedesy
Ma è normale fare così?
Direi di sì, come fai ad eseguire "kill" in una shell che è occupata ad eseguire il tuo programma?
Oppure lo mandi in background, esegui kill, e lo riporti in foreground.
Oppure invece dei SIGUSR gestisci il CTRL+C.

aedesy
08-01-2013, 11:05
Originariamente inviato da c0der
Direi di sì, come fai ad eseguire "kill" in una shell che è occupata ad eseguire il tuo programma?


Immaginavo di aver fatto una domanda stupida :facepalm: . Ancora ne devo fare di strada. Ma ad ogni modo so che il programma è stato scritto bene per le mie conscenze. Grazie dell'aiuto :ciauz:

Loading