1

Plop all,
A l'école on doit coder en C un serveur TCP et je cherche à savoir comment faire pour récupérer le signal SIGINT avec un signal handler avec un argument, le file descriptor pour pouvoir quitter proprement si le client se déconnecte avec Ctrl+C, bien sûr sans utiliser de variable globale (ce serait trop simple grin)
Je précise quand même au cas où que c'est sur Unix ...
Des idées ? thx ^^
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

2

int var

main() {
signal(SIGINT, routine)
var=0;
demarre_thread_qui_devra_etre arrêté()

}

int routine(int signal) {
var=1;
}

void* thread(void* arg) {
listen()
while(var!=1) {
accept()
tout_ça()
}
}

c'est pas du code correct mais c'est l'idée.

sinon, éviter de mettre des routines de lib style printf dans le corps du signal, ça m'a déja joué des sales tours.

3


bien sûr sans utiliser de variable globale (ce serait trop simple grin)


ah oui mais là y a une variable globale var :/
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

4

Ben sans variable globale, je vois pas comment c'est possible...
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

5

L'énoncé c'est ça :

Ajouter au programme précédant la gestion du signal SIGINT correspondant à une interruption utilisateur (^C.) Afin de bien fermer la socket d'écoute (il vous faut trouver un moyen pour récupérer le file descriptor dans le handler du signal, sans variable globale ... )


Y a pas de moyen de passer un paramètre alors ? ...
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

6

Ben le handler du signal, ce n'est pas toi qui l'appelle, il est appelé automatiquement quand le signal est généré. Donc ce n'est pas toi qui choisis les paramètres passés.

Ton énoncé laisse supposer qu'il y aurait un moyen de récupérer le file descriptor d'une socket ouverte, mais je n'en connais pas...
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

7

peut être avec select pour tester l'état de certains FD? sinon je vois pas.

8

Et surtout, je ne vois pas l'intérêt de ne pas utiliser de variable globale. C'est bizarre, comme énoncé.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

9

ptet a base de setjmp/longjmp? mais de toute faut une globale pour y accéder depuis l'intérieur de la fonction signal.

10

Il a pas moyen de passer un pointeur à une variable locale ?

(bon sinon j'avais eu un problème similaire en 68k avec des interruptions dont le code était read-only. la solution était d'utiliser un trap inutilisé comme var globale, l'a qu'à faire pareil trioui)

11

trilove

ça compte pour une variable globale embarrassed

12

J'ai bien une idée via shm_open / / ftruncate / mmap / shm_unlink mais ca me parait super complexe comparé à utiliser une var globale.

13

surtout que j'ai remarqué qu'un simple printf() dans un signal handler faisait planter un programme.

14

squalyl: Pas sur mon emu sorry (es signaux sont utilisé pour afficher un stackframe & co en cas de plantage, et ça marche a merveille, il faut juste eviter de rentrer en boucle infinie de signaux, si tu rentre dans un signal, et qu'il est re-appelé tu abandonne, ie


int signal_SIGINT()
{
static int first_run = YES;
if (first_run)
{
first_run = NO;
do_whatever();
}
}
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

15

Sinon, les fonctions ne sont pas comptées comme des variables globales ?
Tu peux écrire une fonction qui utilise une variable statique.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

16

Vicieux, ça tongue

(cependant, à moins que le prof soit sadique, ce genre de consigne sert normalement à illustrer une méthode particulière... mais je ne vois pas laquelle)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

17

Bah je cherche à récupérer le file descriptor dans le signal handler d'une façon ou d'une autre, pas besoin donc de variable à l'intérieur de mon handler ? ...
Le sujet complet => ici
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

18

En meme temps ça sert a quoi de "bien fermer la socket d'écoute" si le programme est tué ? :/ Bon ok ça doit etre pour l'exo, mais bon dans la "vrai vie" si une application ouvre une socket elle est automatiquement fermé si il est quitté. Pref.

Tiens c'est un épitéen ^^

Sinon je pense que le mieux si ce n'est une variable globale c'est d'utiliser une fonction :
#define MAX_FD 42 void *getset_fd(void *fd, int pos, int mode) { static void*internalFd[MAX_FD]; if (mode == SET) { internalFd[pos] = fd; return fd; } else if (mode == GET) return internalFd[pos]; else printf("DTC^42!"); return 42; }
wink
On a une fonction globale, mais pas une variable wink
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

19

Oui, c'est dans le cadre d'un exercice, ça doit sûrement pas se passer comme ça dans la "vraie vie" comme tu dis
Oui, je suis un épitéen, promo 2013 (normalement)
Et c'est quoi une fonction globale ?
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

20

En fait toutes les fonctions d’un même fichier sont « globales » en C, c’était juste par comparaison aux variables qui peuvent avoir une portée limitée smile
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

21

Ok, je vois comment ça marche smile
Le truc c'est que c'est normal qu'il y ait un return alors que c'est de type void * ? ça devrait pas être de type int ?
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

22

tama (./21) :
Ok, je vois comment ça marche smile
Le truc c'est que c'est normal qu'il y ait un return alors que c'est de type void * ? ça devrait pas être de type int ?

Si, si. Mais il a fait son malin tongue

23

Sous GNU/Linux et certains autres *nix, le dossier /proc/self/fd contient les descripteurs de fichiers ouverts par le processus courant.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

24

Ah, c'est peut-être que ça que le prof attend, alors.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

25

Euh...

Les fonctions bloquantes n'échouent-elles pas automatiquement avec EINTR quand elles sont interrompues par un signal qui n'est ni en Ignore ni en Exit?
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

26

PpHd (./22) :
tama (./21) :
Ok, je vois comment ça marche smile
Le truc c'est que c'est normal qu'il y ait un return alors que c'est de type void * ? ça devrait pas être de type int ?

Si, si. Mais il a fait son malin tongue

C'est tout a fait fonctionnel :*

42 est l'addresse retourné tout simplement

Et void* etant un pointeur sur n'importe quoi je te laisse deviner la suite.
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.