| |||||
| Dernière réponse | |
|---|---|
| Sujet : Communication par signaux entre thread | |
| Matheo | Putain que je suis con ! Je suis con, je suis stupide, je ne mérite même pas de vivre !
Je viens de trouver LE bug qui faisait tout chier dans mon programme et maintenant ça marche impec. C'était tellement une erreur conne que j'en ai honte ! Y'a pas à dire, des fois je me surpasse au niveau de la connerie ! |
| Aperçu |
|---|
| Vue Rapide de la discussion |
|---|
| Matheo | Putain que je suis con ! Je suis con, je suis stupide, je ne mérite même pas de vivre !
Je viens de trouver LE bug qui faisait tout chier dans mon programme et maintenant ça marche impec. C'était tellement une erreur conne que j'en ai honte ! Y'a pas à dire, des fois je me surpasse au niveau de la connerie ! |
| Matheo | Est-ce qu'il y a moyen aussi de passer des paramètres à la fonction reliée au signal ?
Ex : signal(SIGINT, Fonction_A(parametre)) ; |
| Matheo | Ils devraient au moins afficher un message. Sinon, à quoi elle sert la fonction pause() ? |
| Jar Jar | Normal, les processus fils sont morts, le programme terminé, puisque tu ne leur fais rien faire. |
| Matheo | Là je comprends vraiment pas ce qui se passe.
[jfdsdjhfuetppo]--Message édité par Matheo--[/jfdsdjhfuetppo] |
| Jar Jar |
Tu as du mettre le père dans une autre boucle, alors... À moins que la fonction du père ne soit exécutée par erreur par un fils, sinon. |
| Matheo | http://pages.infinit.net/matheo/telnet.jpg Je peux pas croire qu'il ne le réveille jamais. La boucle fait que le père s'exécute à l'infini. |
| Jar Jar | Tu viens de comprendre pourquoi on a inventé les sémaphores et les mutex.
Quand le père envoie SIGCONT, il est possible que le fils ne soit pas encore endormi... |
| Matheo | Je comprends vraiment pas !
|
| Jar Jar | Oui, ça devrait se faire.
Enfin, je suppose que tu voulais dire switch(i)... Au passage, évite signal et utilise plutôt sigaction (c'est plus souple et ça évite certains problèmes). |
| Matheo | Est-ce possible d'exécuter une fonction A lorsque j'envoie un signal SIGCONT du père au fils et une fonction B quand j'envoie un signal SIGCONT du fils au père ?
Exemple
|
| Jar Jar | Aucun problème pour ces deux trucs. |
| Matheo | Étant donné que j'ai un nombre variable de processus mais qu'ils font presque tous la même fonction, est-ce que je peux faire :
|
| Jar Jar | 1) fork renvoie une valeur non nulle (à savoir le pid du fils) uniquement quand on est dans le père, donc c'est le seul à rester dans la boucle, ce qui fait qu'à la fin i==NbMax.
2) Tous ! 3) Du vin, du whisky, de la goutte... À peu près tout ce qui contient de l'alcool, en fait ;) |
| Matheo | Juste une petite précision concernant la création des processus
|
| Jar Jar |
Ouaip ! Surtout que je ne bois pas de bière ! |
| Matheo | Moi je suis à Montréal ! 5000 km pour boire une bière ça fait un peu loin quand même ! |
| Jar Jar |
c01n c01n.
|
| Matheo | Au fait, t'habites dans quel coin ? |
| Jar Jar |
Je t'en prie. |
| Matheo | Ça y est, je commence à y voir clair dans tout ça ! C'est pas évident mais je pense que je vais parvenir à me débrouiller. Je te remercei très fort pour toutes tes indications et si t'habitais proche de chez moi, je te payerais volontiers une bière.[:z-bob] |
| Jar Jar |
Les segments de mémoire partagée, c'est un truc très compliqué pour faire des choses simples. C'est pour ça que depuis on a inventé les threads. (Pareil pour les signaux d'ailleurs, depuis on a inventé les mutex.)
|
| Matheo | Ouais, c'est pas pire ton affaire ! Je pense que je vais m'en inspirer :D Par contre, je ne comprends pas trop bien l'utilisation des segments de données. Je dois attacher le segment à un processus, inscrire des données dedans et les trier puis après un quantum de temps, je fais un backup et j'exécute un autre processus qui fait la même chose. Mes interrogations se situent par rapport aux segments : quel est leur utilité (à quoi ça sert?) et comment les utiliser (avec les paramètres de clé et tout le tralala) ? Je sens que je vais virer dingue ! [:wouaf] [jfdsdjhfuetppo]--Message édité par Matheo--[/jfdsdjhfuetppo] |
| Jar Jar |
Avec ça, tu n'auras pas N processus, mais 2^N...
|
| Matheo |
|
| Jar Jar | 1) Je vais avoir un nombre de processus variables (entre 2 et 20)à chaque exécution. Comment je fais pour en créer autant que je veux tout en enregistrant leur pid à chaque fois car il faut que je puisse les appeler par la suite ?
Bah tu fais une boucle, et tu ranges les pids dans un tableau au fur et à mesure de la création des fils. 2) Segment de mémoire partagée ? J'ai de la difficulté à bien saisir ce que ça fait car j'ai rien dans mes notes de cours là-dessus. Quelqu'un a un lien intéressant là-dessus ? Regarde du côté de shmget, mais je ne te conseille pas de t'en servir si tu peux faire autrement, parce que c'est vraiment tordu. Ça permet de partager une zone de mémoire entre plusieurs processus. [jfdsdjhfuetppo]--Message édité par Jar Jar--[/jfdsdjhfuetppo] |
| Matheo | 1) Je vais avoir un nombre de processus variables (entre 2 et 20)à chaque exécution. Comment je fais pour en créer autant que je veux tout en enregistrant leur pid à chaque fois car il faut que je puisse les appeler par la suite ?
2) Segment de mémoire partagée ? J'ai de la difficulté à bien saisir ce que ça fait car j'ai rien dans mes notes de cours là-dessus. Quelqu'un a un lien intéressant là-dessus ? Merci. |
| Jar Jar |
Auquel cas, soit tu t'arranges pour que les fils n'aient pas à communiquer entre eux mais seulement avec le père, soit tu utilises un segment de mémoire partagée, soit tu trouves une sale combine : je me souviens avoir utilisé jadis une cascade de tubes récursive entre fils pour faire remonter les pids jusqu'au père. Ça marchait bien (je rigole rien que de repenser à cette idée). |
| Matheo | Ouais c'est vrai ! Je prendrai pas de chance et je vais essayer de faire qqchose avec les fork(). Reste à savoir comment m'amuser à gérer tous les fils en même temps. Parce que de la façon mon TP fait, j'ai au moins 6 processus fils plus le père.
Yeah ![:wouaf] |
| Jar Jar |
Ça pourrait marcher. Je ne te le conseille vraiment pas, parce que ça peut donner tout et n'importe quoi.
|
| Matheo |
|
| Jar Jar |
La vache ! C'est pas des TP de tapettes, qu'on vous fait faire ;)
|
| Matheo | Je pensais que je pouvais éviter d'utiliser des fork() mais j'ai bien peur que ce ne soit pas possible. Il ne me reste plus qu'à me taper pas mal de code pour essayer de trouver un moyen de faire ce foutu tp.
C'est assez le bordel car j'ai des notions de processus, algorithmes de tri, lecture de fichier et répertoire, utilisation de tubes nommées, segment de données et tout ça en temps partagé ! La joie quoi ! |
| bjbebert |
Tu es dans le même process. Ce n'est pas getppid (c'est bien le père :??: ) dont tu as besoin, mais le pid du process dans lequel tu te trouves. |
| Jar Jar |
Je vois ça, justement les fonctions de style mutex, sémaphores et conditions des threads, ça sert à ça. Dans l'implémentation LinuxThreads, tout ça est fait à base de signaux, mais c'est assez compliqué (et c'est l'implémentation la plus crade des threads POSIX).
[jfdsdjhfuetppo]--Message édité par Jar Jar--[/jfdsdjhfuetppo] |
| Matheo | Je peux utiliser des processus plutot que des threads mais je dois utiliser des SIGNAUX. Par contre, comment je peux faire pour choisir quel processus je veux exécuter au moment X. Parce que ce que je dois faire, c'est un genre d'ordonnanceur et il faut donc que j'autorise l'exécution d'un seul processus à la fois et après un quantum de temps, je le mets en attente, je passe au suivant etc... |
| Jar Jar | Beuark, quelle horreur, on n'utilise pas de signaux entre threads, ce n'est pas du tout portable, et rien ne dit que ça marchera dans une version prochaine de la glibc.
Essaye plutôt de voir du côté des conditions (pthread_cond_init) ou des mutex (pthread_mutex_init). |
| Matheo | Bonjour
Pour un de mes tp, je dois faire communiquer des threads par des signaux. Cependant, mon tp m'oblige à utiliser le signal SIGCONT. Je m'explique.
|




