Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Débloquer un Scanf SIGALRM

4 réponses
Avatar
John
Bonjour,
j'essaie de "débloquer" un scanf apres 2 secondes par exemple, mais je n'y
arrive pas.
Je pensais que c'été avec SIGALRM, mais ça ne veux pas. J'intercepte bien le
signal et affiche un message, mais le processus est toujours en attente du
scanf :(

voici en gros ce que je fais ...

handler
{
// Interception du SIGALRM
// Relance alarm(2)
}

main()
{

while(condition)
{
alarm(2);
affiche_menu(); // c'est dans cette fonction qu'on met un scanf
}

}

Si vou pouviez me donner une idée ?

Merci

John

4 réponses

Avatar
John
Si vou pouviez me donner une idée ?


fr.comp.sys.unix ?

Si tu remplaces scanf() par fgets, cela fait pareil, non ?
Et par read(0,...) aussi, non ?


Antoine



C bon j'ai trouve ...
mais je ne comprend pas pourquoi

en fait j'avais attaché les signaux a la fonction "handler" avec la fonction
"signal(SIGALRM, handler)".
J'ai remplacé ça par un "sigaction(SIGALRM, &action, NULL)"
avec "action.sa_handler = handler"
et maintenant il me débloque bien le scanf.

Si quelqun sais pourquoi sigaction permet de débloquer le scanf plutot que
signal, j'aimerai bien comprendre

Merci


Avatar
Antoine Leca
En 4086b39e$0$513$, John va escriure:
Si vou pouviez me donner une idée ?


fr.comp.sys.unix ?

Si tu remplaces scanf() par fgets, cela fait pareil, non ?
Et par read(0,...) aussi, non ?


Antoine

Avatar
Yves ROMAN


C bon j'ai trouve ...
mais je ne comprend pas pourquoi

en fait j'avais attaché les signaux a la fonction "handler" avec la fonction
"signal(SIGALRM, handler)".
J'ai remplacé ça par un "sigaction(SIGALRM, &action, NULL)"
avec "action.sa_handler = handler"
et maintenant il me débloque bien le scanf.

Si quelqun sais pourquoi sigaction permet de débloquer le scanf plutot que
signal, j'aimerai bien comprendre



C'est sans doute le SA_RESTART qui est baissé par sigaction(), ce qui fait que
le signal interrompt les appels système qui sortent avec un errno a INTR.
Par defaut ce flag doit être levé, et les appels systèmes reprennent sans rendre
la main à l'appelant.

Avatar
John
"Yves ROMAN" a écrit dans le message de
news:


C bon j'ai trouve ...
mais je ne comprend pas pourquoi

en fait j'avais attaché les signaux a la fonction "handler" avec la
fonction


"signal(SIGALRM, handler)".
J'ai remplacé ça par un "sigaction(SIGALRM, &action, NULL)"
avec "action.sa_handler = handler"
et maintenant il me débloque bien le scanf.

Si quelqun sais pourquoi sigaction permet de débloquer le scanf plutot
que


signal, j'aimerai bien comprendre



C'est sans doute le SA_RESTART qui est baissé par sigaction(), ce qui fait
que

le signal interrompt les appels système qui sortent avec un errno a INTR.
Par defaut ce flag doit être levé, et les appels systèmes reprennent sans
rendre

la main à l'appelant.


D'accord, j'ai fais quelque recherches sur SA_RESTART, ça explique bien ce
qui se passais ...

Merci

John