Bonjour à tous,
fork() est-il portable sur windows X86_64 ?
JPD
Version imprimable
Bonjour à tous,
fork() est-il portable sur windows X86_64 ?
JPD
fork pour ?
Créer un processus ? CreateProcess
Créer un thread ? CreateThread
Portable signifie quoi pour toi ?
Bonjour
Le principe du fork tel que vu sur Unix/Linux (dupliquer un processus dans un environnement neuf et distinct) n'existe pas sous Windows qui a préféré utiliser une autre technologie basée sur les thread (un seul processus qui lance plusieurs "tâches" distinctes mais partageant toutes le même environnement).
Au résultat de base c'est la même chose. Tu peux faire plusieurs choses à la fois. Ce qui change c'est quand tu veux faire communiquer tes trucs entre eux. Sur Unix/Linux les environnements distincts t'imposent de passer par un outil de communication externe (msq, shm, pipe, socket) tandis que sous Windows, comme ils partagent le même environnement tous ont accès à la même mémoire. Et aussi quand ça commence à partir en couilles (sur Unix/Linux la fin d'un processus n'interromp pas les autres tandis que sous Windows, si le processus principal meurt, tout meurt avec lui).
fork sous Linux est un peu comme createprocess sous Windows, à la différence que fork clone le process en cours,createprocess en crée directement un vierge. fork n'est pas utilisé tout seul, on l'utilise en complément d'une fonction de la famille exec (execve, execcl) qui elle va remplacer l’espace d'adressage dans le processus fils par le programme passé en paramètre à execve ou autre fonction exec. Sous Windows, on passe directement le programme à lancer à createprocess.
Les infos ci-dessous sont je pense valables pour Windows et linux:
Chaque processus a son propre contexte d’exécution (donc sa propre pile, son espace d'adressage, ses fichiers ouverts, etc.). Le processus nouvellement crée est le processus fils, le processus depuis lequel il a été créé le processus père. Si le père meurt, ce n'est pas forcément le cas du fils (sous Linux on peut jouer sur ce comportement via les signaux voir ici post 3 de Sver). Je pense que ceci est similaire sous Windows.
Un thread, c'est un sous-processus qui partage le même contexte d''exécution avec les autres threads du processus, sauf que chaque thread d'un processus a sa propre pile.
Pour répondre à la question, fork n'est pas utilisé sous Windows. Mais si tu fais de la cross-compilation, tu pourras néanmoins l'appeler depuis cygwin , peut-être aussi avec MinGW.
J4e8a16n, vous n'avez pas la permission d'accéder à cette page. Ceci peut être dû à plusieurs raisons :
euh....
J'ai entendu dire que techniquement, l'API native de Windows NT supportait les fonctions nécessaires pour forker un processus (i.e. créer un nouveau processus avec toutes les pages mémoire du premier, marquées Copy-On-Write, et au même point d'exécution que le premier*). Mais ces fonctions (RtlCloneUserProcess() etc.) ne sont pas exposées par l'API Win32 (et ne sont pas documentées). Elles sont en revanche, utilisées dans l'implémentation de Windows Subsystem for Linux, ce qui pour toi serait probablement le meilleur pari pour faire marcher un programme qui dépend de fork() et son fonctionnement).
Quant à Cygwin, qui date d'avant WSL, son implémentation de fork() est une usine à gaz.
Conclusion: Si tu as un programme qui dépend de fork() et que tu veux le faire marcher sous Windows, utilise Windows Subsystem for Linux.
*En y repensant, j'ignore comment ça interagit avec le multi-thread...