Quelle est la chose la plus proche de windows contient fork()?
Je suppose que la question dit tout.
Je veux fourche sur windows. Ce qui est le plus semblable opération et comment l'utiliser.
Vous devez vous connecter pour publier un commentaire.
Je suppose que la question dit tout.
Je veux fourche sur windows. Ce qui est le plus semblable opération et comment l'utiliser.
Vous devez vous connecter pour publier un commentaire.
Cygwin a complet fork() sur Windows. Ainsi, si l'utilisation de Cygwin qui est acceptable pour vous, alors le problème est résolu dans le cas de la performance n'est pas un problème.
Sinon, vous pouvez prendre un coup d'oeil à la façon dont Cygwin implémente fork(). À partir d'un très vieux Cygwin l'architecture doc:
Ressemble à beaucoup de travail, n'est-ce pas? Et oui, c'est slooooow.
EDIT: la doc est obsolète, veuillez voir cette excellente réponse pour une mise à jour
fork
pourtant, il l'accomplit avec une qui fuit la solution et vous devez être prêt à des situations inattendues.Certes, je ne connais pas les détails, sur ce point, car je ne l'ai jamais fait, mais le natif NT API a une capacité à fourche d'un processus (le sous-système POSIX sur Windows besoin de cette capacité - je ne suis pas sûr si le sous-système POSIX est encore supportée).
Une recherche pour ZwCreateProcess() devrait vous obtenir un peu plus de détails - par exemple ce bit d'information de Maxim Shatskih:
Mais notez qu' Corinna Vinschen indique que Cygwin trouvé à l'aide de ZwCreateProcess() encore peu fiables:
fork
immédiateexec
", alors peut-être CreateProcess est un candidat. Maisfork
sansexec
est souvent souhaitable et c'est ce que les pilotes de demander un réelfork
.Bien, windows n'a pas vraiment quelque chose de semblable. Surtout depuis que la fourche peut être utilisé pour conceptuellement créer un thread ou un processus sous *nix.
Donc, je dirais:
CreateProcess()
/CreateProcessEx()
et
CreateThread()
(J'ai entendu dire que pour des applications C,_beginthreadex()
est mieux).Les gens ont essayé de mettre en œuvre la fourche sur Windows. C'est la chose la plus proche d'elle que je peut trouver:
Prises à partir de: http://doxygen.scilab.org/5.3/d0/d8f/forkWindows_8c_source.html#l00216
fork
plante, ça plante le programme, ou le fil juste crash? Si il bloque le programme, puis ce n'est pas vraiment un fork. Juste par curiosité, parce que je suis à la recherche d'une vraie solution, et espérons que cela pourrait être une bonne alternative.Avant Microsoft a présenté sa nouvelle "sous-système Linux pour Windows" option,
CreateProcess()
était la chose la plus proche de Windows contientfork()
, mais Windows vous demande de spécifier un fichier exécutable à exécuter dans ce processus.La création des processus UNIX est très différent de Windows. Son
fork()
appel essentiellement duplique le processus actuel de près de au total, chacun dans leur propre espace d'adressage, et continue de courir séparément. Alors que les processus eux-mêmes sont différents, ils ont toujours la même programme. Voir ici pour avoir un bon aperçu de lafork/exec
modèle.Aller de l'autre côté, l'équivalent de la Windows
CreateProcess()
est lefork()/exec()
paire de fonctions UNIX.Si vous étiez le portage de logiciels pour Windows et vous n'avez pas l'esprit d'une couche de traduction, Cygwin fourni la capacité que vous voulez, mais il était plutôt kludgey.
Bien sûr, avec la nouvelle Sous-système Linux, la chose la plus proche de Windows contient
fork()
est faitfork()
🙂fork
en moyenne, les non-WSL application?Le document suivant fournit de l'information sur le portage de code à partir d'UNIX pour Win32:
https://msdn.microsoft.com/en-us/library/y23kc048.aspx
Entre autres choses, il indique que le modèle de processus est assez différente entre les deux systèmes et recommande l'examen de la fonction CreateProcess et CreateThread où fork()-comme le comportement est nécessaire.
fork() sémantique est nécessaire que lorsque l'enfant a besoin d'accéder à la mémoire réelle de l'état de la mère comme de l'instant fork() est appelée. J'ai un morceau de logiciel qui repose sur l'implicite mutex de la mémoire de la copie de l'instant fork() est appelée, ce qui rend les threads impossible à utiliser. (C'est émulé sur moderne *nix, via des plates-formes de copie sur écriture/mise à jour d'une mémoire de la table de la sémantique.)
Le plus proche de ce qui existe sur Windows comme un syscall est la fonction CreateProcess. Le mieux qu'on puisse faire est pour le parent de geler tous les autres threads pendant le temps qu'il est la copie de la mémoire sur le nouveau processus de l'espace de mémoire, puis de les décongeler. Ni le Cygwin frok [sic] de la classe, ni le code Scilab qu'Eric des Courtis posté le fil de gel, que je peux voir.
Aussi, vous ne devriez pas utiliser le Zw* fonctions, sauf si vous êtes en mode noyau, vous devriez probablement utiliser le Nt* fonctions à la place. Il ya un supplément de branche qui vérifie si vous êtes en mode noyau et, si non, effectue toutes les vérifications de limites et les paramètres de vérification que le Nt* toujours faire. Ainsi, il est très légèrement moins efficace à les appeler depuis le mode utilisateur.
"dès que vous voulez faire de l'accès aux fichiers ou printf puis io sont refusé"
Vous ne pouvez pas avoir votre gâteau et le manger aussi... dans msvcrt.dll, printf() est basé sur la Console API, qui lui-même utilise lpc pour communiquer avec la console de sous-système (csrss.exe). Connexion avec csrss est initiée au processus de démarrage, ce qui signifie que tous les processus qui commence son exécution "dans le milieu" qui sera mis à l'étape sauté. Sauf si vous avez accès au code source du système d'exploitation, alors il est inutile d'essayer de se connecter à csrss manuellement. Au lieu de cela, vous devez créer votre propre sous-système, et par conséquent d'éviter les fonctions de la console dans les applications qui utilisent fork().
une fois que vous avez mis en place votre propre sous-système, n'oubliez pas de dupliquer tous les parents de poignées pour le processus de l'enfant;-)
"Aussi, vous ne devriez pas utiliser le Zw* fonctions, sauf si vous êtes en mode noyau, vous devriez probablement utiliser le Nt* fonctions à la place."
ZwGetContextThread(NtCurrentThread(), &le contexte);
Vos meilleures options sont La fonction CreateProcess() ou CreateThread(). Il n'y a plus d'informations sur le portage de ici.
Il n'est pas facile à imiter fork() sur Windows.
Je vous suggère d'utiliser des threads au lieu.
fork
était exactement ce que CygWin n'. Mais, si jamais vous lisez sur comment ils l'ont fait, yor "pas facile" est une brute misunderstatement 🙂Le plus proche de vous dire... Laissez-moi réfléchir... Cela doit être fork (), je suppose 🙂
Pour les détails, voir Ne Interix mettre en œuvre fork()?
Si vous ne se soucient que de la création d'un sous-processus et l'attente, peut-être _spawn* API dans le processus.h sont suffisantes. Voici plus d'informations à ce sujet:
https://docs.microsoft.com/en-us/cpp/c-runtime-library/process-and-environment-control
https://en.wikipedia.org/wiki/Process.h