processus

processus - C++ - Programmation

Marsh Posté le 04-07-2002 à 11:54:49    

Bonjour,
 
Comment je peux faire pour qu'un processus père puisse avoir accès à un tableau de caractères dont le propriétaire est son processus fils?

Reply

Marsh Posté le 04-07-2002 à 11:54:49   

Reply

Marsh Posté le 04-07-2002 à 12:06:33    

Gaspard a écrit a écrit :

Bonjour,
 
Comment je peux faire pour qu'un processus père puisse avoir accès à un tableau de caractères dont le propriétaire est son processus fils?




mets ce tableau dans un segment de shared memory...

Reply

Marsh Posté le 04-07-2002 à 12:08:48    

une bonne claque dans la gueule et le problème est réglé :D


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 04-07-2002 à 13:52:44    

BENB, pour le segment de mémoire partagée, si j'ai bien compris il faut que j'utilise qqch comme shmget()

Reply

Marsh Posté le 04-07-2002 à 13:57:26    

Gaspard a écrit a écrit :

BENB, pour le segment de mémoire partagée, si j'ai bien compris il faut que j'utilise qqch comme shmget()


Il y a beaucoup plus simple : les threads POSIX.
man pthread_create


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 04-07-2002 à 14:37:37    

J'ai pas envie de refaire tout mon programme en utilisant des thread plutôt que des processus alors je pense que je vais faire ce que me conseille BENB

Reply

Marsh Posté le 04-07-2002 à 14:38:17    

Gaspard a écrit a écrit :

J'ai pas envie de refaire tout mon programme en utilisant des thread plutôt que des processus


Bah rien ne t'empêche de mélanger les deux...


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 04-07-2002 à 15:59:01    

joce a écrit a écrit :

une bonne claque dans la gueule et le problème est réglé :D




 
Faut mettre des chaussettes. :D


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 04-07-2002 à 18:10:28    

Jar Jar a écrit a écrit :

Il y a beaucoup plus simple : les threads POSIX.
man pthread_create




Non au contraire... C'est bien plus compliqué avec des Threads...
 
La au moins il n'y a que le segment de memoire où il peut a avoir conflit d'acces, il n'y a aucun Pb de reponse à un signal, etc...
 
Contrairement a bcp d'idées reçues, le multi-process est plutot plus simple que le multi-thread, surtout si les différentes taches sont vraiment decouplées...
 
Sinon ou shmget pour l'allouer ou le retrouver...
ipcs pour le voir depuis la ligne de commande...

Reply

Marsh Posté le 04-07-2002 à 19:29:30    

et ipcrm quand t'as chié dans la colle :D


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 04-07-2002 à 19:29:30   

Reply

Marsh Posté le 04-07-2002 à 19:48:57    

BENB a écrit a écrit :

 
Non au contraire... C'est bien plus compliqué avec des Threads...
 
La au moins il n'y a que le segment de memoire où il peut a avoir conflit d'acces, il n'y a aucun Pb de reponse à un signal, etc...
 
Contrairement a bcp d'idées reçues, le multi-process est plutot plus simple que le multi-thread, surtout si les différentes taches sont vraiment decouplées...
 
Sinon ou shmget pour l'allouer ou le retrouver...
ipcs pour le voir depuis la ligne de commande...




 
Sous unix y'a pvm : Paralel(l) Virtual Machine ou un truc dans le genre.


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 05-07-2002 à 09:48:49    

BENB a écrit a écrit :

Non au contraire... C'est bien plus compliqué avec des Threads...


Pour avoir expérimenté les deux, je ne trouve pas DU TOUT...
Après, c'est peut-être une question de goûts et de méthodes, mais bon...


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 05-07-2002 à 10:10:39    

Jar Jar a écrit a écrit :

Pour avoir expérimenté les deux, je ne trouve pas DU TOUT...
Après, c'est peut-être une question de goûts et de méthodes, mais bon...




Peut-etre n'es tu pas allé au fonds des choses...
 
Conflits d'acces memoire limites au segments de memoires partagés en multi-process
 
Parties de codes non reentrantes ne genent pas en multi-process
 
Enfin la gestion des signaux ne pose aucun problèmes en multiprocess...

Reply

Marsh Posté le 05-07-2002 à 10:42:56    

BENB a écrit a écrit :

Conflits d'acces memoire limites au segments de memoires partagés en multi-process


Le fait que la mémoire soit la même n'est pas un problème mais ce qu'on recherche quand on fait des threads. À moins de programmer comme un porc, les threads ne vont pas s'amuser à aller tout le temps écrire dans la même zone mémoire.
 

Citation :

Parties de codes non reentrantes ne genent pas en multi-process

Du code non réentrant ? Ça existe ?
 

Citation :

Enfin la gestion des signaux ne pose aucun problèmes en multiprocess...

Ça, c'est un problème lié uniquement à l'implémentation LinuxThreads, pas aux threads en eux-mêmes. Pthreads-NG devrait résoudre ça en se conformant correctement à POSIX.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 05-07-2002 à 10:50:26    

Citation :

Du code non réentrant ? Ça existe ?


 
Plusieurs fonctions de la librairie standard
sont non reentrantes.
En gros, celles qui ont un état interne codé
avec un bon vieux "static".
 
Il existe des versions reentrantes des fonctions de librairies
en general avec un _r ajouté à la fin mais evidemment leur prototype est different.
 
La compatibilité avec les threads, a l'epoque ou je codais
sous Linux, n'était pas tres bonne puisque deux threads
pouvaient avoir besoin de ces fonctions en simultané d'ou la necessité de coder avec les versions reentrantes (a moins de tout proteger avec des sections critiques mais bof..).
 
LeGreg

Reply

Marsh Posté le 05-07-2002 à 10:57:10    

Jar Jar a écrit a écrit :

Le fait que la mémoire soit la même n'est pas un problème mais ce qu'on recherche quand on fait des threads. À moins de programmer comme un porc, les threads ne vont pas s'amuser à aller tout le temps écrire dans la même zone mémoire.
 

Citation :

Parties de codes non reentrantes ne genent pas en multi-process

Du code non réentrant ? Ça existe ?
 

Citation :

Enfin la gestion des signaux ne pose aucun problèmes en multiprocess...

Ça, c'est un problème lié uniquement à l'implémentation LinuxThreads, pas aux threads en eux-mêmes. Pthreads-NG devrait résoudre ça en se conformant correctement à POSIX.




Le code non reentrant, oui ca existe, et en grande quantité, surtout quand tu travailles sur une application ancienne et de grande taille !
 
La programmation des Threads n'est pas impossible, et tout ce que je cite se resouds, mais en multiprocess, ces problèmes ne se posent pas, d'ou une plus grande simplicité...

Reply

Marsh Posté le 05-07-2002 à 12:15:21    

legreg a écrit a écrit :

Plusieurs fonctions de la librairie standard
sont non reentrantes.
En gros, celles qui ont un état interne codé
avec un bon vieux "static".
 
Il existe des versions reentrantes des fonctions de librairies
en general avec un _r ajouté à la fin mais evidemment leur prototype est different.


gcc -D_REENTRANT
(oui, je sais, toutes les libc ne sont pas aussi bien foutues que la glibc)


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 05-07-2002 à 12:44:37    

joce a écrit a écrit :

et ipcrm quand t'as chié dans la colle :D




 
et tous les soir, les profs scannent les machines et zou, - 1 pt par IPC et par taches retrouvés :D

Reply

Marsh Posté le 05-07-2002 à 13:16:53    

Jar Jar a écrit a écrit :

gcc -D_REENTRANT
(oui, je sais, toutes les libc ne sont pas aussi bien foutues que la glibc)




 
je crois que tu n'as pas bien compris le probleme.
 
Le fait de specifier le flag _REENTRANT
ne rend pas reentrantes les fonctions qui  
intrinsequement ne peuvent pas l'etre.
 
asctime() n'est pas reentrante meme avec le flag _REENTRANT
parce que la chaine de retour est stockée comme
un static char result[].
 
en cas de programme multithread
il FAUT utiliser asctime_r.
 
De plus la reentrance n'est pas seulement un probleme
pour les applications multithreads
mais également celles qui font des appels
successifs à la meme fonction: on s'attend
a ce qu'un deuxieme appel à la fonction de temps
ne change pas la premiere valeur retournée.
(c'est comme si on te donnait un bonbon, et  
que la personne qui te l'a donné vienne te le reprendre
pour le donner a quelqu'un d'autre)
 
LeGreg

Reply

Marsh Posté le 05-07-2002 à 13:40:17    

LeGreg > et surtout ce flag ne change pas les fonctions qui ne font pas partie de bibliotheque standard...
 
Fonction quelques fois ecrites en FORTRAN, ou à une epoque ou la notion de multi-threading n'existait meme pas...

Reply

Marsh Posté le 05-07-2002 à 16:06:07    

legreg a écrit a écrit :

Le fait de specifier le flag _REENTRANT
ne rend pas reentrantes les fonctions qui  
intrinsequement ne peuvent pas l'etre.
 
asctime() n'est pas reentrante meme avec le flag _REENTRANT
parce que la chaine de retour est stockée comme
un static char result[].


Évidemment... Mais quand on fait du MT, c'est typiquement le genre de fonction qu'on appelle dans un thread et pas dans les autres. Sinon, bien sûr, on n'a pas le choix, il faut utiliser un mutex. C'est quand même pas bien sorcier...


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 05-07-2002 à 18:10:49    

ah oui et tu communiques
comment le fait qu'il faut entourer les sections
critiques avec un mutex??
et tu le places ou ton mutex, dans un header
public? dans un wrapper qui transforme
asctime en truc reentrant?
 
C'est pas mieux de compter sur l'intelligence de tes
collegues (tout est relatif, on en a bien la preuve)
pour ne pas utiliser les fonctions de librairie
non threadsafe?  
 
Surtout que au final si tu regardes le code
de asctime(), tout cela va finir par
un appel a asctime_r
et c'est bien dommage d'utiliser une section
critique pour ca..
 
LeGreg

Reply

Marsh Posté le 05-06-2003 à 10:57:49    

ce n'est pas plus dur avec les threads étant donné que avec tu n'as pas à créer ton mutex avec des sémaphore une fonction est concu pour ca.


---------------
L'été il fait bo
Reply

Marsh Posté le 05-06-2003 à 11:00:05    

DarkOli a écrit :


 
Sous unix y'a pvm : Paralel(l) Virtual Machine ou un truc dans le genre.


 
heuh oui, mais c koi le rapport [:le kneu]

Reply

Marsh Posté le 05-06-2003 à 11:45:53    

Gaspard a écrit :

Bonjour,
 
Comment je peux faire pour qu'un processus père puisse avoir accès à un tableau de caractères dont le propriétaire est son processus fils?


 
Je tiens a dire ke je respecte fortement les gens ki ont deviné l'OS et le langage... Franchement bravo les gars, paske le sujet etait kan meme "tres" precis.
Aller, juste pour faire chier je vais dopnner la solution ms sous Win32 :  

Code :
  1. // Processus 1
  2. DWORD uBytes = // taille du bordel
  3. HANDLE hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, (DWORD)uBytes, "FileMapping_a_moi" );
  4.        
  5. LPVOID lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  6. CopyMemory(lpMapAddress, lpBuffer /* Mon buffer de donnees */, uBytes);


Code :
  1. // Processus 2
  2. hMapFile = OpenFileMapping(FILE_MAP_READ, FALSE, "FileMapping_a_moi" );
  3. lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
  4. if (lpMapAddress == NULL)
  5. break;
  6. // Faire du bordel avec lpMapAdress      
  7. UnmapViewOfFile(lpMapAddress);
  8. CloseHandle(hMapFile);


 
Donc, ya les FileMapping, ms ya aussi les named pipes (sous 2K) par exemple. Et encore plein de solutions.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed