PDA

Visualizza versione completa : Domanda su "c"


Puppauz
20-05-2003, 21.19.10
Qualcuno sa se esiste una qualche porzione di codice che funzioni come i vari timer di alto livello?
La mia situazione é questa: eseguo dei calcoli che possono durare molto e mi servirebbe una funzione che ogni (es.) 15 secondi mi salvi una variabile su file di testo.

Altra domanda: codice che funzioni come handler, per gestire la pressione di certi tasti.
Es: se premo CTRL-C il prog mi lancia una funzione che salva la variabile su file e poi esce...

Grazie a chi mi saprà aiutare! :)

P8257 WebMaster
20-05-2003, 21.42.30
Multithreading in c++ e java?

E' piuttosto facile risolvere tutto questo coi thread.

Bye :cool:

Puppauz
20-05-2003, 21.47.39
posso utilizzare al massimo c++, ma ho dei grossi problemi dovuti all'utilizzo di una libreria GNU specifica x Linux.
Il codice é scritto in c ed eseguito tramite CygWin...
:)

quipo.it
21-05-2003, 10.03.02
anche in C puro è possibile usare la programmazione concorrente... prova a cercare "fork"

Puppauz
21-05-2003, 10.12.37
la "fork" crea dei processi figli, non dei processi concorrenti!
Stavo valutando la possibilità di utilizzare la funzione pthread() offerta da *nix...

P8257 WebMaster
21-05-2003, 10.33.21
(Y)

pholcus
21-05-2003, 11.30.03
Se controlli bene puoi gestire i CTRL-C e i vari interrupt con la funzione *nix

signal(int signo, void(*func)(int))

Puoi catturare tutti i segnali che vuoi
e difinire una funzione che li catturi..Comodissimo..

In particolare per il tuo caso puoi usare la funzione alarm(15) per impostare un timer di 15 secondi, e con la funzione

signal(SIGALRM, tua_Funzione)

impostare l'handler per il tuo interrupt.

Ciao


edited:

Per catturare il CTRL-C:


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

static void sig_int(int);

int main(void){

if( signal(SIGINT, sig_int) == SIG_ERR)
perror("signal");

printf("Waiting signal..\n");
pause();
exit(0);
}

static void sig_int(int signo){

printf("Caught signal %d\n",signo);
printf("Exiting..\n");
exit(0);
}

Puppauz
21-05-2003, 11.52.40
in pratica dovrei impostare un signal(SIGALRM,...) e alarm(...) all'inizio del main e automaticamente ogni 15 secondi mi viene richiamata la funzione che gli ho passato come parametro al signal.
Ma lo fa solo una volta o lo ripete finché glielo dico io?
Se ho capito bene, così facendo non avrei bisogno di thread...

Grazie per il codice appena inviato!
:)

pholcus
21-05-2003, 11.53.20
Ah, dimenticavo di dire un problema che avevo trovato:

Il ripristino dell'handler originale deve essere fatto con signal(signo, SIG_DFL) per lo standard POSIX.

Se si compila invece con l'argomento --ansi, l'handler viene ripristinato automaticamente una volta usata la funzione handler, quindi ogni volta bisognerebbe rifare l'assegnamento..Occhio quindi..

Ciao

PS: consiglio il libro: Advanced Programming in the Unix Environment di Richard Stevens.

pholcus
21-05-2003, 12.13.07
Ah, un'altra cosa: chiaramente se metti exit(0); nella funzione che hai dichiarato il programma esce..

Prova a controllare l'output di

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

static void sig_alrm(int);

int main(void){

if( signal(SIGALRM, sig_alrm) == SIG_ERR)
perror("signal");

alarm(5);
printf("1 Waiting signal..\n");
pause();
alarm(5);
printf("2 Waiting signal..\n");
pause();

exit(0);
}

static void sig_alrm(int signo){

printf("Caught signal %d\n",signo);
printf("Executing handler function..\n");

}

prima compilato normalmente e poi con --ansi

Ciao

Puppauz
21-05-2003, 12.21.42
grazie, appena vado a casa provo! :)

quipo.it
21-05-2003, 21.48.05
Originariamente inviato da Puppauz
la "fork" crea dei processi figli, non dei processi concorrenti!

D'accordo, però tramite fork, signal e pipe è possibile gestire processi concorrenti. Se hai bisogno di una guida, puoi dare un'occhiata a questa: http://webservices.polito.it/matdid/3ing_inf_N5030_TO_0/esaula2000/Modulo%20II/manuale%20programmazione%20concorrente%20odasso.pd f

E' un po' vecchiotta ma sempre valida.

Puppauz
21-05-2003, 23.08.46
grazie x il file...
Ora sto comunque avendo molti problemi a far andare nuovamente CygWin e GMP insieme... :(

Puppauz
24-05-2003, 17.16.34
Grazie a tutti x i suggerimenti!
Ho risolto prendendo spunto da questo pezzo di codice:

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

int handler() {
static int counter = 0;
counter += 1;
printf("%d seconds passed\n", counter);
signal(SIGALRM, handler);
alarm(1);
}

main(argc,argv)
int argc;
char ** argv;
{
signal(SIGALRM, handler);
alarm(1);
while(1) {
sleep(60);
}
}

:)