IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

fermer le terminal après avoir lancer la cmd SYSTEM


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 69
    Points
    69
    Par défaut fermer le terminal après avoir lancer la cmd SYSTEM
    Bonjour,

    Je débute en C++.
    J’exécute une commande dans system. Et suite à la commande, terminal s'ouvre et exécute ma commande.
    Comment puis-je fermer le terminal par programme pour finir ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <iostream>
     
    int main(int argc, const char * argv[]) {
        system("open -n /Applications/Notes.app/");
        return 0;
    }
    Il y a t-il une alternative a system pour exécuter un autre programme ?

    Merci de votre aide,

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    ajouter un "exit" en fin de script mais utiliser "system", c'est tout pourrie.

    Il y a t-il une alternative a system pour exécuter un autre programme ?
    https://msdn.microsoft.com/en-us/lib...or=-2147217396

    https://msdn.microsoft.com/en-us/lib...or=-2147217396

    etc...

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 451
    Points : 43 097
    Points
    43 097
    Par défaut
    Vu le texte, je pense qu'il est sur Apple le gars.

    La commande open ne semble pas faite pour lancer une appli mais pour ouvrir un doc avec le logiciel sensé l'ouvrir.

    https://developer.apple.com/library/...n1/open.1.html

    Essayes ceci ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    system("/Applications/Notes.app/Contents/MacOS/Notes");
    Sur mac, les Applications .app sont des espèces de dossiers virtuels dont on peut voir le contenu avec bouton droite afficher le contenu du paquet, si ça marche pas vérifie que le chemin que je t'es donné est bon (j'ai pas de mac sous le coude).

    J'ai pas de mac pour tester là. Et sinon, en théorie la fonction system appelle le terminal pour executer la commande lui ayant été passée en paramètre, celui-ci se fermant lors de la fermeture de Notes dans l'exemple.

    Essayes avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    system("/Applications/Notes.app/Contents/MacOS/Notes&");
    Pas sûr que ça marche, le & est sensé lancer la commande en tache de fond.

    Sinon, il doit avoir une fonction dans l'API mac OS pour faire cela.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonsoir
    Citation Envoyé par bella1 Voir le message
    Bonjour,
    Je débute en C++.
    J’exécute une commande dans system. Et suite à la commande, terminal s'ouvre et exécute ma commande.
    Comment puis-je fermer le terminal par programme pour finir ?
    Oui il existe des alternatives à la commande système qui permet d'exécuter une autre application indépendamment de l'application appelante en clair cela se traduit par, j'ouvre mon programme, celui-ci crée un processus fils qui va par la suite exécuter un programme. (pour faire simple). Et c'est alternatif sont dite des primitives de recouvrement qui font partie de la famille EXEC.

    Citation Envoyé par chrtophe Voir le message
    Vu le texte, je pense qu'il est sur Apple le gars.
    La commande open ne semble pas faite pour lancer une appli mais pour ouvrir un doc avec le logiciel sensé l'ouvrir.
    https://developer.apple.com/library/...n1/open.1.html
    Essayes ceci ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    system("/Applications/Notes.app/Contents/MacOS/Notes");
    Sur mac, les Applications .app sont des espèces de dossiers virtuels dont on peut voir le contenu avec bouton droite afficher le contenu du paquet, si ça marche pas vérifie que le chemin que je t'es donné est bon (j'ai pas de mac sous le coude).
    J'ai pas de mac pour tester là. Et sinon, en théorie la fonction system appelle le terminal pour executer la commande lui ayant été passée en paramètre, celui-ci se fermant lors de la fermeture de Notes dans l'exemple.
    Essayes avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    system("/Applications/Notes.app/Contents/MacOS/Notes&");
    Pas sûr que ça marche, le & est sensé lancer la commande en tache de fond.
    Sinon, il doit avoir une fonction dans l'API mac OS pour faire cela.
    Votre instruction fonctionne sur un mac. Cependant "system" ne fonctionnera pas correctement avec les programmes ayant des privilèges.
    Citation Envoyé par bella1 Voir le message
    Bonjour,
    Il y a t-il une alternative a system pour exécuter un autre programme ?
    Oui voici une alternatives qui utilise un processus fils afin d'exécuter un programme.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    /* Crée un processus fils qui exécute un nouveau programme */
    int main(int argc, const char *argv[] ) {
        return ( (0) == fork() ) ? 
         execv( "/Applications/Notes.app/Contents/MacOS/Notes", NULL ) : getpid();
    }
    En complément à mon exemple voici un lien pour plus de détail
    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  5. #5
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 69
    Points
    69
    Par défaut
    Bonjour,
    Merci pour vos réponses.
    J'utilise un mac.

    Toutes les solutions fonctionnent mais le terminal reste toujours ouvert.
    Il n'est pas possible qu'il se ferme après avoir ouvert l'application Notes.app ?

    Encore merci,

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 451
    Points : 43 097
    Points
    43 097
    Par défaut
    Il faut à mon avis, comme je l'ai dit utiliser les fonctions des API Apple (Cocoa).

    Tu peux aussi utiliser un fork (création d'un nouveau process) suivi d'une fonction exec dont t'as parlé sambia39 (dans le processus fils).

    https://developer.apple.com/library/...n2/fork.2.html
    https://developer.apple.com/library/...n3/exec.3.html

    Il s'agit là des fonctions BSD, pas des fonctions native Mac OS X. (mais tu peux les utiliser). L'utilisation de fork/exec ne t'ouvrira pas de terminal.

    La fonction system crée un nouveau processus avec fork, lance un terminal avec execve avec en arguments ce que tu as passé à la fonction system.

    En googlisant, je suis tombé sur ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[NSWorkSpace sharedWorkspace] launchApplication:@"/Applications/Safari.app"];
    mais c'est pas du C++, c'est de l'objective-C. Je ne sais pas si tu peux appeler la fonction launchApplication en C++. Pour plus d'info tu peux poser la question dans le forum dédié mac.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par bella1 Voir le message
    Bonjour,
    Merci pour vos réponses.
    J'utilise un mac.
    Toutes les solutions fonctionnent mais le terminal reste toujours ouvert.
    Il n'est pas possible qu'il se ferme après avoir ouvert l'application Notes.app ?
    Encore merci,
    Bonjour
    Je suis sur un Mac également et les deux exemples qui vous ont été fournie fonctionnent correctement.
    Là où vous faites référence c'est quand vous cliquer deux fois sur un exécutable et que celui-ci exécute par la suite votre instruction qui va créer un processus fils afin d'exécuter un autre programme dont le non ou le chemin complet lui a été fournie. Mais après exécution vous avez un terminale qui est toujours active dans lequel vous avez juste le retour de votre programme lancer en clair , le chemin complet de l'exécutable et une indication avec exit. Si c'est de cette fenêtre dont vous parler, c'est normal. Car il me semble que c'est un peu la trace d'exécution de votre programme. Je ne suis pas sûr mais, il doit faire appel à un primitif système et lancer un processus qui attend la fin d'exécution ( un expert système Mac pourrait nous éclairer) de votre programme ou autres.
    L'alternative dans cette situation est de tuer le processus initial c'est-à-dire, le mécanisme qui est à l'origine de l'exécution de votre programme et il faut le faire juste après la fin d'exécution de votre programme en clair, vous allez mettre en place une sorte de court-circuit barbare qui a pour but de ne pas laisser trainer la console de trace.
    D'un autre côté sans vous offenser, vous êtes débutant en programmation et mettre un système de court-circuit demande certaines notions en programmation système et la connaissance du système en question et cela, afin d'éviter la corruption ou la déstabilisation de votre système.
    Le conseil qui me semble utile pour vous est de laisser ce détail de côté pour l'instant le temps que vous aillé les bases suffisantes et d'un autre côté, system suffit dans votre cas pour un débutant sauf si le but est d'exécuter votre programme de façon furtive à l'insu de l'utilisateur, là c'est autre chose et pas très conforme.
    à bientôt.
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  8. #8
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 69
    Points
    69
    Par défaut
    Merci pour ces informations, je vais tester.

    Cdt,

  9. #9
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 451
    Points : 43 097
    Points
    43 097
    Par défaut
    @sambia39 : donc le fork/exec c'est bon ? pas de fenêtre ?

    Faut-il appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec("/Applications/Notes.app");
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec("/Applications/Notes.app/Contents/MacOS/Notes");
    ou les 2 fonctionnent ?

    Merci du retour.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  10. #10
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    @sambia39 : donc le fork/exec c'est bon ? pas de fenêtre ?

    Faut-il appeler :
    exec("/Applications/Notes.app");
    (1)execv("/Applications/Notes.app", NULL );

    ou :
    exec("/Applications/Notes.app/Contents/MacOS/Notes");
    (2) execv("/Applications/Notes.app/Contents/MacOS/Notes", NULL);

    ou les 2 fonctionnent ?
    Merci du retour.
    Bonjour
    le cas 1 ne fonctionnera pas car elle fournit aucun résultat mais le second oui.
    Et comme j'ai essayé de le mentioner dans mon dernier post, la fenêtre qui reste active est celle que l'on a cliqué deux fois pour le lancer ( je ne sais pas si vous avez compris ) et cette fenêtre est juste une fenêtre de trace d'exécution du programme et c'est justement celle-ci qui lui pose problème. Par contre si vous exécutez la commande ./Out_monexec dans un terminale celui-ci va exécuter le code mais dépendra de l'implémentation utilisé c'est-à-dire que si vous faites
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main(int argc, const char *argv[] ) {
         execv( "/Applications/Notes.app/Contents/MacOS/Notes", NULL );
         return EXIT_SUCCESS;
    }
    Votre console dépendra de l'application en cours d'exécution ("elle ne rend pas la main") si vous fermez la console, vous fermez également l'application. Si vous fermer l'application, la console reprend la main.
    Avec le code ci-dessous, vous pouvez fermer le terminale car celui-ci a crée un autre processus pour que "Notes" puisse fonctionner indépendamment de la console.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main(int argc, const char *argv[] ) {
        return ( (0) == fork() ) ? 
         execv( "/Applications/Notes.app/Contents/MacOS/Notes", NULL ) : getpid();
    }

    Citation Envoyé par bella1 Voir le message
    Bonjour,
    #include <iostream>
    int main(int argc, const char * argv[]) {
    system("open -n /Applications/Notes.app/");
    return 0;
    }
    Je reviens sur ce que j'ai dit concernant l'instruction system dans un code source ("ne fonctionnera pas correctement avec les programmes ayant des privilèges."). Je dirais plutôt pas de la même façon.
    System, exécute le programme en cherchons dans le path sans faire de fork ou passer par un membre de la famille exec. Et en apprentissage de la programmation système, cette instruction (system) est acceptable dans une limite stricte. Mais dans un programme informatique cette commande est à proscrire part soucie de sécurité.

    /!\ Avant d'avancer mes raisons sur la proscription de l'instruction système dans un code sources et de ces dangers . Je tiens avant tout choses à décliner toute responsabilité de la façon dont le contenue de ce poste sera employé directement ou indirectement sous n'importe quelle forme dans l'hypothèse où il sera utilisé à des fins inappropriées qui pourraient corrompre ou endommager un système informatique.

    Imaginé un utilisateur X qui a accès à la même machine que vous administrateur de votre ordinateur et qu'il puisse modifié la valeur d'entré de son path en mettant au tout début un répertoire du genre ./blabla/rep_test/ dans lequel se trouve un programme dont les instruction ne peuvent qu'être exécuter en mode root.
    Normalement si vous administrateur système avez très bien paramétrer votre système, aucun script système de l'utilisateur X ou lambda ne peut être exécuter son les droits nécéssaire. Mais admettant si vous donner des droits à un exécutable de façon à ce que tout le monde puisse l'exécute avec les droits administrateurs et que dans votre programme ( une variante du programme de @bella1 ) vous avez écrit "system("init_save_all") qui est le non d'un script permettant a tout utilisateur de lancer une sauvegarde ou un bibule X pour la bonne cause.
    Le petit programme tout simple devient alors potentiellement dangereux et capable d'injecter voir d'excuser des programmes ou script en mode root et si on pousse l'expérience assez loin, on peut même faire une élévation de privilège et bonjour les dégâts.
    à bientôt.
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  11. #11
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 451
    Points : 43 097
    Points
    43 097
    Par défaut
    Merci pour le retour mais les trigraphes pour un débutant c'est un peu chaud. Ce serait sympa pour lui si tu pouvais lui expliquer et mettre l'équivalent sans.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    Je reviens sur ce que j'ai dit concernant l'instruction system dans un code source ("ne fonctionnera pas correctement avec les programmes ayant des privilèges."). Je dirais plutôt pas de la même façon.
    System, exécute le programme en cherchant dans le path sans faire de fork ou passer par un membre de la famille exec.
    Euh, comment est-ce possible? Y a-t-il un appel noyau system() qui crée un nouveau processus à partir de rien?
    Ou bien la version Mac de system() est-elle à la place basée sur une IPC vers le shell graphique (le Window Manager?), lui demandant de faire le fork+exec() lui-même, un peu comme ce code Windows le fait?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour
    Citation Envoyé par Médinoc Voir le message
    Euh, comment est-ce possible? Y a-t-il un appel noyau system() qui crée un nouveau processus à partir de rien?
    Ou bien la version Mac de system() est-elle à la place basée sur une IPC vers le shell graphique (le Window Manager?), lui demandant de faire le fork+exec() lui-même, un peu comme ce code Windows le fait?
    Attention la commande "system()" permet de lancer une commande ou un programme à partir d'un programme, mais sa particularité est qu'il lance un nouveau shell afin d'interpréter la commande. Quant aux primitives de recouvrement (exec), il charge en mémoire à la place du processus fils un autre programme avec des possibilités comme le passage des arguments ou d'environnement.
    Quant à votre question je ne peux certifier dans l'immédiat si système fait appel aux IPC sur un mac mais cela peut être possible à vérifier.
    à bientôt.
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

Discussions similaires

  1. [Batch] Fermer une tâche si elle n'a pas terminé après "x" secondes.
    Par MacZourite dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 01/06/2015, 09h04
  2. Réponses: 1
    Dernier message: 12/04/2010, 15h46
  3. Afficher un message, après avoir cliquer sur FERMER
    Par horse dans le forum Débuter
    Réponses: 2
    Dernier message: 05/04/2010, 03h08
  4. Le script continu à trouner même après avoir fermer le navigateur
    Par sami_c dans le forum Serveurs (Apache, IIS,...)
    Réponses: 1
    Dernier message: 01/07/2008, 14h40
  5. [NAV 2004] Bug après avoir renommé la corbeille
    Par Halleck dans le forum Windows
    Réponses: 2
    Dernier message: 29/02/2004, 21h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo