150

spectras :
En bref, Cygwin est un outil de développeur ou d'administrateur, absolument pas un outil pour les utilisateurs et encore moins pour les débutants.

Bah quand même...
Je me vois en tant qu'utilisateur quand je fais de la console sous Cygwin.

151

Utilisateur avancé alors. Parce que utilisateur, pour moi c'est celui qui ouvre sa session kde, lance openoffice, lit son courrier avec kmail et se promène sur le net avec firefox.

152

Et puis, entre Windows et Linux, la différence est encore plus grande pour les développeurs...

Je trouve que Windows est meilleur pour les communications entre deux processus:
Je n'ai pas encore trouvé l'équivalent Linux de DuplicateHandle()... Sans parler des fonctions d'attente qui sont les mêmes quellle que soit la ressource attendue... (WaitForSingleObject() etc.)

Enfin c'est peut-être pas le bon topic ni le bon forum por dire ça...
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.

153

boah on parle de mixage winux alors te gêne pas, on peut en parler smile

154

Je n'ai que peu de connaissances en programmation système, donc je fais certainement dire une boulette, mais le fork() linuxien ne permet de dupliquer qu'un process ? On ne peut pas dupliquer un Handle ?
avatar

155

Bon, bah après quelques recherches sur google, la réponse est "non" ^^
Mais j'ai trouvé un lien assez intéressant qui devrait t'aller, link :
http://www-106.ibm.com/developerworks/eserver/library/es-MigratingWin32toLinux.html
avatar

156

En fait si tu veux passer des fichiers au processus fils, suffit de les ouvrir avant. A moins que tu ne demandes le contraire, le fils hérite de tous les fichiers ouverts (normal en même temps puisque fork() par définition crée deux processus identiques).

157

spectras :
suffit de les ouvrir avant.


Tout est dit.
Mais sous nux, il est IMPOSSIBLE de passer une ressource anonyme (un socket, par exemple) à un autre processus sans lien de parenté.

L'exemple de DuplicateHandle montré sur le lien de nil n'apprend qu'à tuer un programme de la façon la plus sanglante qui soit, à supposer qu'on ait déjà le Handle que le processus distant utilise pour son thread...
En fait, je me demande bien d'où ils ont tiré le code win32 à remplacer par le kill(pid, SIGKILL) de Linux (oui, TerminateProcess, ça fait bien un KILL et non un TERM bang)

De plus, KillTimer et Alarm(0) annulent bien un compte à rebours, mais celui-ci n'est pas du tout géré de la même façon sous windows et linux... Sous Windows, c'est un Message comme les autres (ce qui a ses inconvénients, c'est loin d'être "temps réel") qui peut être ignoré sans problème.
Si une librairie linux inconnue utilise alarm sans prévenir, le programme sera tué...

Autre chose, pour le Process Still Exists: C'est complètement mauvais, et c'est même précisé dans la doc, surtout que le processus peut très bien retourner la valeur STILL_ACTIVE. Il faut utiliser WaitForSingleObject() avec un timeout nul, pour éviter ce genre de problème

Bon, pour CreateThread/ _beginthread et ExitThread/_endthread , je crois que c'est bon, ce sont simplement les fonctions de l'ancienne API...
Par contre:
TerminateThread((HANDLE *) threadId, 0);

!! Je ne vois pas comment ils se permettent d'associer ainsi un Id de Thread Win32 (Qui est un entier unique dans le système) à un pointeur sur Handle... La fonction OpenThread n'existe pas pour rien... Surtout que CreateThread retourne directement un Handle...
EDIT: J'ai dit une connerie, je n'avais pas vu qu'ils appelaient ThreadId un pointeur sur Handle... On n'a pas idée non plus, d'appeler chien un pointeur sur chat...

Bref, il n'est pas si facile que ça d'égaler les possibilités de certains programmes Windows avec Linux...
Et puis, j'ai consulté les mans, select est bien moins polyvalent que MsgWaitForMultipleObjectsEx qui permet d'attendre en un seul thread toutes sortes de ressources différentes (y compris un sémaphore et un autre processus/thread, j'ai vérifié, select ne le fait pas)

Bref, je préfère Windows pour programmer, et même si vous me prouvez que Linux est mieux, je trollerai pour le casser (et puis je suis comme ça, je trouve que le fork/exec est plus lourd que CreateProcess)
Edit: et moins fiable en plus: CreateProcess retourne immédiatement une erreur si la ligne de commande est mauvaise, ou immédiatement une bonne nouvelle si ça marche. Sous nunux, si la ligne de commande est mauvaise, le père n'a aucun moyen de le savoir, puisque le fils retourne une erreur tout de suite ou une bonne nouvelle A LA FIN du programme...
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.

158

hehe Create* et WaitFor(Single|Multiple)Object powaaaa
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.

159

oui

Sous nux, il faut pratiquement une fonction pour chaque, donc soit un timeout -->retard pour les autres, soit une boucle d'attente active qui les teste tous en non-bloquant (ça bouffe), soit un thread pour chaque descripteur (ça bouffe aussi, et ça devient vachement dur à synchroniser)
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.

160

Godzil :
hehe Create* et WaitFor(Single|Multiple)Object powaaaa

D'ailleur c'est pour ça que mon (#v4p0r# de) OS aura des IPC/RPC (pour le serveur Multitache) proche syntaxiquement et d'utilisation de ceux de windows ^^
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.

161

Avec les IPC mineures disponibles tout de suite? trilove
(La file de message pour chaque Thread, une trouvaille! Un seul SendMessage suffit pour obtenir un Handle vers une plus grosse ressource comme une mémoire partagée ou un pipe, même anonyme!

Le mieux selon moi: SendMessage[Timeout](hWnd, <message de RegisterWindowMessage()>, wParam au choix, <ProcessId ou HWND émetteur>);

(Attention toutefois, si tu utilises Win9x: la note dessus était bien cachée, mais SendMessageTimeout utilise un WPARAM de 16 bits (et non 32) sur ces versions. Mais le must de Windows, c'est qu'ici on n'en a pas besoin).
)
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.

162

Bref, je préfère Windows pour programmer, et même si vous me prouvez que Linux est mieux, je trollerai pour le casser (et puis je suis comme ça, je trouve que le fork/exec est plus lourd que CreateProcess) Edit: et moins fiable en plus: CreateProcess retourne immédiatement une erreur si la ligne de commande est mauvaise, ou immédiatement une bonne nouvelle si ça marche. Sous nunux, si la ligne de commande est mauvaise, le père n'a aucun moyen de le savoir, puisque le fils retourne une erreur tout de suite ou une bonne nouvelle A LA FIN du programme...
Sauf que CreateProcess est une fonction EXTREMEMENT lente. Le ration CreateProcess / fork est de l'ordre de 200 ou 500 un truc comme ça en terme de temps utilisé.

De plus autant il est possible de faire comme CreateProcess en utilisant fork()+exec() autant il est absolument impossible sous windows de faire l'équivalent de fork().


Ah et j'oubliais (edit) : trouve moi une utilité à la création d'un handle dans un autre processus (à part pour implémenter les multiples exploits d'injection de handle dans des processus système de windows)

163

CreateProcess est plus lent que Fork, d'accord. Mais est-ce plus lent que fork+exec?

Et comme je l'ai dit, fork+exec n'apporte au père aucune confirmation que son fils s'est bien lancé, sauf si le fils est prévu pour communiquer avec le père (bonne chance pour simplement lancer un démon)


Et puis, je ne suis pas sur qu'on puisse ouvrir librement un processus système de Windows avec l'accès PROCESS_DUP_HANDLE... Quand je vois qu'il FAUT être le système pour utiliser CreateProcessAsUser... (LogonUser ne suffit pas...)

Et l'utilité, je l'utilise en ce moment même, pour pouvoir changer de serveur actif sur mon PC sans fermer le socket entre deux (bon d'accord, fermer complètement un serveur pendant une seconde, c'est pas la mort, surtout que je ne fais rien de professionnel...)
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.

164

sans dec... y'a pas moyen de faire l'équivalent de fork sous win?

165

Je ne pense pas, car Fork copie toutes les variables. Au mieux, CreateProcess copie tous les Handles, mais il faut toujours passer leurs numéro au fils, soit par la ligne de commande soit par un tube qu'on aurait mis à la place de stdin. (stdin, stdout et stderr peuvent être récupérés sans problème par le fils avec GetStdHandle)

Mais surtout, un truc que je ne supporte pas sous Linux, c'est qu'un fils doit toujours se terminer avant le père. Bonne chance pour lancer deux ou trois démons et terminer le prog ensuite... On n'a pas ce genre de problème sous Windows...


Et puis, un truc que j'ai du mal à comprendre, c'est POURQUOI pratiquement tous les Unix Users s'amusent à tuer les processus de la façon la plus sanglante possible?
Quelqu'un de mon école (un troisième année en plus) est allé jusqu'à nous reprocher de ne pas terminer une session par kill -9 -1 (envoie SIGKILL à tous), parce qu'UNE FOIS mozilla a planté et n'a pas été quitté quand j'ai fermé ma session...
C'est si excitant que ça d'exécuter une commande qui pour TOUS les processus sauf le noyau, équivaut à débrancher la prise?
Surtout quand on sait que kill -15 -1 (envoie SIGTERM à tous) suffit généralement à tout arrêter normalement, en laissant toutefois aux processus une possiblilité de nettoyage/sauvegarde... D'ailleurs, c'est la procédure d'arret standard de linux: Il envoie SIGTERM à tous et attend plusieurs secondes avant d'achever les récalcitrants avec SIGKILL...
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.

166

Mais surtout, un truc que je ne supporte pas sous Linux, c'est qu'un fils doit toujours se terminer avant le père. Bonne chance pour lancer deux ou trois démons et terminer le prog ensuite... On n'a pas ce genre de problème sous Windows...

Mais si le père reste Zombie ?
Pis perso, j'utilise souvent kill sous windows, moi cheeky (mais bon, uniquement quand le système n'est plus très stable).
Ah, si, j'utilise aussi kill quand j'appuie sur le bouton Power et que Windows s'éteint en mode rapide (fermeture sauvage de tous les process actifs, sauvegarde du minimum vital, power down)
avatar

167

Et comme je l'ai dit, fork+exec n'apporte au père aucune confirmation que son fils s'est bien lancé, sauf si le fils est prévu pour communiquer avec le père (bonne chance pour simplement lancer un démon)
C'est marrant ça a jamais causé de problème particulier, d'autant qu'il est très simple pour le père de savoir si ça a marché ou non vu que le noyau informe le père en temps réel de ce qui arrive au fils.
Et puis, je ne suis pas sur qu'on puisse ouvrir librement un processus système de Windows avec l'accès PROCESS_DUP_HANDLE... Quand je vois qu'il FAUT être le système pour utiliser CreateProcessAsUser...
En théorie non c'est pas possible. En pratique, as-tu déjà été vérifier la totalité des opérations que tu peux interdire aux autres processus de faire au tien ? As-tu la moindre idée des vulnérabilités que tu peux créer juste en oubliant d'aller interdire, par exemple, le DuplicateHandle ? De fait, il est arrivé que des développeurs de services systèmes de windows oublient d'aller interdire le DuplicateHandle. Et toi dans tes progs, est-ce que tu penses systématiquement à le faire ?
(LogonUser ne suffit pas...)
Pour avoir développé ma propre GINA et travaillé avec l'authentification dans Active Directory (eh oui on a tous nos periodes sombres cheeky ) j'ai un bon aperçu du fonctionnement de la sécurité sous windows.
Je ne pense pas, car Fork copie toutes les variables. Au mieux, CreateProcess copie tous les Handles, mais il faut toujours passer leurs numéro au fils, soit par la ligne de commande soit par un tube qu'on aurait mis à la place de stdin. (stdin, stdout et stderr peuvent être récupérés sans problème par le fils avec GetStdHandle)
Si tu as besoin de faire ça c'est que tu fais du multiprocessus. Pour ce type d'utilisation, fork() est bien plus appropriée puisqu'elle crée duplique le processus (mais je te confirme qu'il n'existe pas d'équivalent de fork() sous windows. Le code typique d'un serveur, par exemple, est
while() {
accepteruneconnection();
pid = fork();
if (pid == 0) { gérer la connexion(); exit(0); }
fermerlaconnexion(); }

Mais surtout, un truc que je ne supporte pas sous Linux, c'est qu'un fils doit toujours se terminer avant le père. Bonne chance pour lancer deux ou trois démons et terminer le prog ensuite...
C'est complètement faux. neutral
Et puis, un truc que j'ai du mal à comprendre, c'est POURQUOI pratiquement tous les Unix Users s'amusent à tuer les processus de la façon la plus sanglante possible? Quelqu'un de mon école (un troisième année en plus) est allé jusqu'à nous reprocher de ne pas terminer une session par kill -9 -1 (envoie SIGKILL à tous)
Je ne connais personne qui fasse ça neutral. De plus ça n'envoie pas le signal à tous les processus mais que aux tiens, ce qui est une nuance importante.

168

je savais pas du tout comment faire avant, donc j'ai fait un gros helloworld de fork pour faire un daemon y'a pas longtemps:

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

int main (int argc , char **argv) {
  int i;

  switch(fork()) {
    case -1:
      printf("Erreur a duplication du processus\n");
      exit(-1);
      break;
    case 0:
      printf("Demarrage du fils\n");
      execv(argv[0], &argv[1]);
      break;
    default:
      printf("le rocessus pere ne fait rien");
      break;
   }
}

ba ça marche et le processus dupliqué tourne en fond même quand je me délogge et tout.

169

squalyl^2: Oui, mais c'est sale et ça laisse des processus à l'état zombie... Il me semble que l'état zombie cause des leaks, non?
En plus, ton prog surcharge le système jusqu'à ce qu'une erreur veuille bien se produire, là...

spectras: donc, un serveur crée un nouveau processus par client. C'est uniquement pour la stabilité? Car on peut très bien faire un serveur avec un thread par client, et même un serveur avec un thread pour tous, c'est plus économique...

Pour duplicatehandle, je dois t'avouer que je ne touche jamais à la DACL de mes programmes. En plus, il n'y a de sécurité que sous les windows de type NT, et j'ai un vieux 98se sur un de mes PC, sur lequel j'ai tendance à faire tourner mes programmes...
Et puis, je n'écris pas de service système windows. Si on n'a pas "pensé à interdire PROCESS_DUP_HANDLE", c'est que le programmeur a choisi quoi interdire, et non quoi autoriser. Pour moi, ça, c'est une erreur encore plus grosse, pour un service système windows..

Au fait, je comprends qu'il puisse être intéressant de piquer un handle à un processus pour accéder à ses objets, mais à quoi sert-il d'insérer un handle dans un autre processus? Il faut ensuite obliger cet autre process à l'utiliser pour que ça serve à quelque chose... confus
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.

170

Oui, mais c'est sale et ça laisse des processus à l'état zombie... Il me semble que l'état zombie cause des leaks, non? En plus, ton prog surcharge le système jusqu'à ce qu'une erreur veuille bien se produire, là...
- non ça ne laisse pas les processus à l'état de zombie. Quand le père d'un processus meure, tous ses fils sont adoptés par le processus init, qui détruit tous les zombies
- non les zombies ne provoquent pas de leaks. un processus zombie ne consomme que les quelques octets nécessaires pour retenir son numéro, son code de retour et deux ou trois autres stats. Tout le reste a déjà été libéré.
spectras: donc, un serveur crée un nouveau processus par client. C'est uniquement pour la stabilité? Car on peut très bien faire un serveur avec un thread par client, et même un serveur avec un thread pour tous, c'est plus économique...
C'est plus fiable (puisqu'un plantage ne tue pas le serveur), c'est plus sûr (puisqu'un client ne peut pas interagir avec d'autres clients, vu qu'ils sont dans des espaces d'adressages distincts), et c'est tout aussi efficace, l'appel fork() étant extrèmement rapide (plus rapide que CreateThread sous windows, parce que beginthread doit initialiser des choses supplémentaires dans les librairies alors que fork() n'a rien à toucher).
Pour duplicatehandle, je dois t'avouer que je ne touche jamais à la DACL de mes programmes. En plus, il n'y a de sécurité que sous les windows de type NT, et j'ai un vieux 98se sur un de mes PC, sur lequel j'ai tendance à faire tourner mes programmes... Et puis, je n'écris pas de service système windows. Si on n'a pas "pensé à interdire PROCESS_DUP_HANDLE", c'est que le programmeur a choisi quoi interdire, et non quoi autoriser. Pour moi, ça, c'est une erreur encore plus grosse, pour un service système windows..
C'est sûr, bien géré c'est pas un problème. Mais ça ajoute un point d'entrée vers ton processus, ça ajoute une possibilité de se tromper.
Au fait, je comprends qu'il puisse être intéressant de piquer un handle à un processus pour accéder à ses objets, mais à quoi sert-il d'insérer un handle dans un autre processus? Il faut ensuite obliger cet autre process à l'utiliser pour que ça serve à quelque chose...
Ben en fait à ce que j'avais compris en regardant comment ça marchait à l'époque où ces failles avaient été trouvées, ça utilisait le fait que les handles alloués étaient prévisibles et que le service n'interdisait pas le DuplicateHandle. De fait on pouvait alors lui coller un handle de notre choix en lieu et place de celui qu'il aurait dû accéder.

171

C'est vri que maintenant que j'y pense, le fork n'a rien à charger puisque c'est une bète copie du segment de données...
MAis il reste quand même à rajouter de l'initialisation pour les .so de linux, non? il me semble qu'elles équivalent à des DLL, et une DLL ne doit pas forcément se permettre d'ignorer la création d'un nouveau process...

Donc normalement, le fork a des choses supplémentaires à toucher.
quand au beginthread, un simple appel à DisableThreadLibraryCalls() élimine ce problème...
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.

172

Non le fork n'a absolument rien à toucher :
- il ne réalise pas réellement la copie, il marque juste les pages C-on-W
- il "copie" indifféremment les données la pile et le code, il n'y a absolument rien à toucher.

Jusqu'à l'état des registres qui est identique ^^

173

Il faut bien qu'il copie tout le segment de données, puisque modifier une donnée dans un process ne la modifie pas dans l'autre.
Et il est bien obligé de toucher aux libs: si l'une d'elles maintient un compteur pour savoir combien de process lui sont reliés, il faut qu'elle soit notifiée de la création d'un nouveau process...

Sauf si les libs dynamiques Linux n'ont jamais de code d'initialisation... ou n'ont jamais de mémoire partagée...
Celles de Windows ont DllMain() et peuvent avoir de la mem partagée...
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.

174

T'as pas l'air de bien comprendre ce qu'est un fork(), ni comment fonctionne la pagination sur tous les systèmes modernes (comprendre depuis 20 ans).

Pour la pagination (qui permet de faire un fork() sans avoir à copier quoi que ce soit en mémoire)
- il n'est pas nécessaire de copier les données. Il suffit juste de marquer la zone interdite en écriture. Quand un des deux processus écrit, une exception survient. Là l'os fait la copie de la page (4ko) et relance le programme qui a provoqué l'exception. Comme une proportion minime des l'espace virtuel est modifié, ceci se fait à un coup minimal, négligeable par rapport à une copie.

Pour le fonctionnement du fork() : les deux processus existant après l'appel sont totalement similaires en tout point. La copie du processus se fait sur un programme DEJA initalisé avec les bibliothèques DEJA chargées et initialisées.
Bref pour résumer :
Il faut bien qu'il copie tout le segment de données, puisque modifier une donnée dans un process ne la modifie pas dans l'autre.
c'était vrai à l'époque de l'amstrad et de l'IBM PC.
Et il est bien obligé de toucher aux libs
Que nenni, le noyau n'est absolument pas au courant de l'existence d'un concept appelé "bibliothèque partagée" (qui est de toutes façon un concept applicatif totalement en dehors des fonctions d'un noyau) et le fork() n'est pas concerné par ces sordides affaires de linkage dynamique.
si l'une d'elles maintient un compteur pour savoir combien de process lui sont reliés
STOP! ceci supposerait que bibliothèque soit une entité extérieure consciente de la présence de processus multiples. Tout faux. Une bibliothèque est un bout de code qui est chargé et lié au programme dans son espace d'adressage et est donc totalement indépendent de tout autre programme qui se trouverait utiliser le même bout de code.
il faut qu'elle soit notifiée de la création d'un nouveau process...
Ben elle est au courant quand elle est initialisée. Il n'y a pas de notion de "nouveau" processus. La bibliothèque est un élément intégrant d'UN programme dans UN processus.
Sauf si les libs dynamiques Linux n'ont jamais de code d'initialisation... ou n'ont jamais de mémoire partagée...
attends... un bibliothèque ? de la mémoire partagée ? on doit pas parler de la même chose. Jusqu'à preuve du contraire l'espace d'adressage est un des composants définissant un processus, et la mémoire partagée est un élément du processus.
Celles de Windows ont DllMain() et peuvent avoir de la mem partagée...
Voir ci-dessus. Le DllMain est une aberration quand il s'agit de processus (threads pourquoi pas). C'est un bout de code s'exécutant magiquement sans que le programme appelant ait rien demandé. Par ailleurs je ne vois pas plus le rapport avec "il faut qu'elle soit notifiée de la création d'un nouveau process...". Sous windows, quand ta bibliothèque est chargée, DllMain est appelé pour qu'elle s'initialise (et pareil avant de la fermer d'ailleurs). Je vois pas le rapport avec de la communication interprocessus.

175

G mal à la tête..........
C'est mon avis, je le partage....

176

Spectras:
http://msdn.microsoft.com/library/en-us/dllproc/base/using_dynamic_link_libraries.asp

DllMain permet d'initialiser la librairie au démarrage, par exemple en allouant de la mémoire pour le processus courant, ou ses threads.
Bien sur, si le fork existait sous windows, on n'aurait pas besoin de rappeler DllMain si on avait la certitude qu'il n'avait des effets que sur le segment de données. Mais puisqu'une librairie peut faire plus pour chaque processus, comme utiliser de la mémoire partagée ( http://msdn.microsoft.com/library/en-us/dllproc/base/using_shared_memory_in_a_dynamic_link_library.asp ), une librairie peut garder en mémoire le nombre de processus l'utilisant, ou mémoriser tous les pid des processus auxquels elle est reliée, etc.

Bien sur, si sous Linux, DllMain et compagnie n'existent pas, si une lib Linux n'est que du code qui ne gère pas d'initialisation ni de mémoire partagée, le problème ne se pose plus...


Pour la copie: Si j'ai bien compris, la page mémoire n'est copiée que la première fois qu'un process tente d'écrire dedans? C'est plus économique en effet...
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.

177

Pour la copie: Si j'ai bien compris, la page mémoire n'est copiée que la première fois qu'un process tente d'écrire dedans? C'est plus économique en effet...
oui
DllMain permet d'initialiser la librairie au démarrage, par exemple en allouant de la mémoire pour le processus courant, ou ses threads.
Voilà jusque là pas de pb, même si le choix est disctuable et que de très nombreuses DLL préfèrent ne rien faire là et avoir une fonction d'iniitalisation distincte (sinon en cas d'erreur l'utilisateur se mange une vilaine boite de dialoge comme que le programme ne peut pas être exécuté c'est pas top)
Bien sur, si sous Linux, DllMain et compagnie n'existent pas, si une lib Linux n'est que du code qui ne gère pas d'initialisation ni de mémoire partagée, le problème ne se pose plus...
Pour ce qui est de la mémoire partagée, c'est totalement indépendant des bibliothèques (et c'est d'ailleurs ce qui est expliqué dans ton lien : ils montrent comment faire pour mettre en oeuvre de la mémoire partagée entre un ensemble de processus non déterminé à l'avance, cet ensemble se trouvant être l'ensemble de programmes utilisant une dll).

Sous Linux pour bien comprendre ce qui se passe, il faut distinguer 2 cas :
1- l'initialisation de la bibliothèque au chargement d'un programme. Celle-ci est une vraie initialisation, avec lecture depuis le disque, linkage en ram, etc. C'est là que serait appelée DllMain si cette méthode avait été retenue.
2- le fork(). Comme la copie du fork() est intégrale, la librairie est déjà initialisée des deux côtés, ce qui fait qu'elle n'a pas besoin d'être initalisée ou prévenue d'une quelconque manière. Les deux processus étant indépendants, chaque clone n'a pas conscience d'avoir été cloné. D'ailleurs ils n'auraient aucun moyen de se distinguer l'un de l'autre si fork() ne renvoyait pas une valeur différente à chaque processus.

Ceci est valable pour tout. La copie étant complète, si avant le fork() la bibliothèque avait pour une raison X ou Y créé un segment de mémoire partagée (rien ne l'en empèche, mais c'est totalement indépendant de son status de bibliothèque), après le fork() les deux processus résultant ont tous deux cette zone de mémoire partagée. Idem pour les fichiers/sockets ouverts, les signaux masqués, les variables d'environnements, etc.
une librairie peut garder en mémoire le nombre de processus l'utilisant, ou mémoriser tous les pid des processus auxquels elle est reliée, etc
Je ne vois pas pourquoi une bibliothèque ferait ça, puisque par définition elle rend un service en fournissant un ensemble de fonctions, et faire interagir des processus différents depuis un morceau de code ne faisant pas partie du programme principal est TRES peu recommandé.
Néanmoins, tu le ferais sous linux exactement comme tu le fais sous windows : la fonction d'initialisation de la bibliothèque obtiendrait un handle sur une ressource partagée, par exemple un sémaphore ou une zone de mémoire partagée (note qu'il n'y aurait à faire cela que dans le cas n°1, dans le cas n°2 tout ça est cloné par fork()).

178

C'est super intéressant toussa j'apprends plein de trucs, merci les gens qui connaissent.

179

spectras
: D'ailleurs ils n'auraient aucun moyen de se distinguer l'un de l'autre si fork() ne renvoyait pas une valeur différente à chaque processus.

Ben si, le PID du fils change, celui du père non... (par contre y aurait sans doute pas moyen pour le père de savoir si le fork() a réussi ^^)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

180

Pollux> oui j'y ai pensé. On pourrait aussi jouer sur la liste des signaux en attente il me semble, et le ppid voire le pgid. Mais je cherchais à être clair plus qu'à être complet,