Question :
Comment créer un processus Go et obtenir un nouveau ID de processus ?
Réponse :
Pour créer un processus Go et obtenir l'ID du nouveau processus, vous pouvez utiliser la fonction syscall.ForkExec(), qui se trouve dans le paquet d'appel système.
Il est à noter que la fonction fork() de la bibliothèque Go ne peut pas répondre à vos besoins.
Lorsque la fonction fork() a été inventée pour la première fois, les threads n'étaient pas utilisés et le processus n'avait toujours qu'un seul thread d'exécution, donc le fork était sûr. Cependant, l'utilisation intensive par Go de threads au niveau du système d'exploitation pour piloter la planification des goroutines change fondamentalement la situation.
Undecorated fork(2) sous Linux fait désormais uniquement en sorte que le processus enfant ait un seul thread qui appelle fork(2) dans le processus parent, tandis que tous les threads utilisés par le runtime Go (y compris certains threads critiques) ne le sont plus. parmi eux. Fondamentalement, cela signifie que vous ne pouvez pas vous attendre à ce que le processus enfant continue à exécuter le code Go, la seule chose que vous pouvez raisonnablement faire est d'exécuter exec(2) immédiatement. Notez que c'est à cela que syscall.ForkExec() est censé être utilisé.
Maintenant, réfléchissez-y davantage. Je pense que la seule chose qui est utile à l'heure actuelle pour appeler directement fork(2) est un "instantané de l'état du processus asynchrone au mieux" comme celui utilisé par Redis. Cette technique repose sur le fait que le processus enfant hérite de toutes les pages de données mémoire de son processus parent, mais le système d'exploitation utilise la technique de copie sur écriture sans copier réellement toutes les données, de sorte que le processus enfant peut s'arrêter là et sauvegarder toutes les données. structures sur le disque pendant que son processus parent modifie les données dans son propre espace d'adressage. Et toute autre utilisation possible de fork() signifierait exec() instantané, ce à quoi servent des fonctions comme exec.Command(), alors pourquoi utiliser fork() ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!