web-dev-qa-db-fra.com

Existe-t-il un moyen de ne pas attendre la fin d'une commande system ()? (en c)

Similaire à:
programme n'exécutant rien après un appel à system ()

Je suis assez nouveau dans l'utilisation de C mais, fondamentalement, je veux exécuter la ligne suivante:

int a = system("python -m plotter");

qui lancera un module python que j'ai développé. Cependant, je veux que le reste de mon programme c continue à fonctionner au lieu d'attendre la fin de l'exécution de la commande (l'application python est sur une boucle infinie, donc elle ne se fermera pas automatiquement). Existe-t-il un moyen de le faire en utilisant C/C++?

Mise à jour: la solution était:

int a = system("start python -m plotter &");
29
gh4x

system() passe simplement son argument au Shell (sur les systèmes de type Unix, généralement /bin/sh).

Essaye ça:

int a = system("python -m plotter &");

Bien sûr, la valeur renvoyée par system() ne sera pas l'état de sortie du script python, car il ne sera pas encore terminé.

Cela ne fonctionnera probablement que sur des systèmes de type Unix (y compris probablement MacOS); en particulier, cela ne fonctionnera probablement pas sur MS Windows, sauf si vous utilisez Cygwin.

Sous Windows, system() appelle probablement cmd.exe, Qui n'accepte pas les commandes avec la même syntaxe utilisée sur les systèmes de type Unix. Mais la commande Windows start devrait faire le travail:

int a = system("start python -m plotter");

Tant que vous écrivez du code spécifique à Windows (start ne fonctionnera pas sur Unix, sauf si vous avez une commande start dans votre $PATH), Vous pourriez envisager en utilisant une fonctionnalité Windows de niveau inférieur, peut-être en appelant StartProcess . C'est plus compliqué, mais cela vous donnera probablement plus de contrôle sur la façon dont le processus s'exécute. D'un autre côté, si system() répond à vos besoins, vous pourriez aussi bien l'utiliser.

34
Keith Thompson

Il n'y a aucun moyen dans la bibliothèque standard, mais vous pouvez créer ou créer un thread séparé qui l'exécuterait en arrière-plan, si votre système d'exploitation le prend en charge.

4
littleadv

Je crois que si vous ajoutez un "&" à la fin de la commande, cela fonctionnera. '&' indique à la commande de s'exécuter en arrière-plan

int a = system("python -m plotter &");
4
love_me_some_linux

La commande "System" sur Linux ne laissera le reste du code s'exécuter que lorsqu'il aura fini de s'exécuter.

Vous devez utiliser fork () si vous souhaitez un traitement simultané.

2
jscode

Le mot pour cela est un appel de fonction/méthode asynchrone. C et C++ n'ont pas une telle fonctionnalité, vous devez donc appeler la fonction dans un thread séparé ou utiliser un appel système qui l'exécutera dans un processus distinct. Ces deux méthodes ont tendance à être spécifiques à la plateforme, bien qu'il existe des bibliothèques de threading multiplateforme.

Je sais que sous unix pour le faire dans un processus séparé, vous utiliseriez fork (2) pour créer un nouveau processus et exec (3) pour exécuter un nouveau programme dans ce processus. Je ne sais pas quels appels système seraient requis dans Windows, mais devraient être quelque chose de similaire.

1
David Brown