Equivalent de NSTask en C++

MathMath Membre
11:00 modifié dans Actualités #1
Bonjour,

Pour un projet en C++ sous linux j'aurai besoin de controler un prog qui est en ligne de commande. Je cherche en fait un équivalent de NSTask en objectiv-c.

Avez-vous une idée de comment je pourrai faire ?

Merci d'avance.

Réponses

  • AliGatorAliGator Membre, Modérateur
    11:00 modifié #2
    Tu utilises quel framework, quel environnement ?

    Si c'est du C++ pur sous Linux (j'entend par "pur" : sans framework additionnel genre QT ou GTK, limite un programme en ligne de commande), les méthodes de base du C comme system() peuvent faire l'affaire. execve() et ses confrères aussi.

    Si tu utilises QT ou GTK à  voir avec la doc des frameworks concernés s'ils ont des fonctions de plus haut niveau (comme NSTask en Cocoa) pour faire ça.
  • MathMath Membre
    11:00 modifié #3
    Ouaip pur, pas de GTK ou autre mais je vais quand meme regarder du coté de GTK.

    Pour system() je connaissais mais je crois pas que l'on ai la meme souplesse qu'avec NSTask. execve() je connais pas par contre. Je vais me pencher dessus.

    Merci pour ta réponse.
  • AliGatorAliGator Membre, Modérateur
    11:00 modifié #4
    dans 1140625428:

    Ouaip pur, pas de GTK ou autre mais je vais quand meme regarder du coté de GTK.

    Pour system() je connaissais mais je crois pas que l'on ai la meme souplesse qu'avec NSTask. execve() je connais pas par contre. Je vais me pencher dessus.

    Merci pour ta réponse.
    Ok si tu n'utilises pas de framework particulier (pas d'interface graphique non plus ?), c'est un truc du genre system() qu'il te faut, (mais si possible tu veux + souple). Ok.

    Mais ce sont donc des appels en C pur que tu vas devoir utiliser (ça ne vaut pas le coup de se pencher sur un framework comme QT ou GTK juste pour avoir ça, je disais ça plutôt si tu utilisais déjà  par exemple QT pour te faire une interface graphique)

    A moins qu'il existe quelque chose dans les librairies standard de C++ (et non pas du C), mais que je ne connaitrais donc pas, je me pencherai donc plutôt vers le execXY (en particulier execv ou execl) --> pages man de ces fonctions

    Ce sont un lot de fonctions qui remplacent le programme courant par le programme spécifié (soit spécifié par son chemin, soit juste son nom et il chercher le programme dans le PATH, c'est la série des "exec*p"), en passant les arguments spécifiés (sous forme de liste avec la famille "execl*", sous forme de tableau avec la famille "execv*"), et tu peux préciser l'environnement (variables setenv) avec la série des "exec*e".

    Pour pouvoir lancer le programme voulu EN PLUS du programme courant et non à  la place, il suffit de faire un fork. Cela sépare ton application en 2 (le parent et l'enfant). Il suffit alors de tester la valeur de retour et si on est dans le process "enfant", alors on fait son execl.
    Ensuite les commandes comme "wait" peuvent servir à  s'attendre entre parent et enfant.

    Une petite recherche google te donnera des exemples sur comment combiner fork, execl (ou autre exec*) et wait pour faire ça. Ca peut paraà®tre compliqué de prime abord je te l'accord, mais avec un petit code d'exemple on voit que c'est pas méchant en fait.
  • maconnectmaconnect Membre
    11:00 modifié #5
    et "popen" tu l'aimes pas ?
  • AliGatorAliGator Membre, Modérateur
    11:00 modifié #6
    Ah ben oui tiens je l'avais oublié celui là  :D
    En effet, il est carrément plus sympa :)

    Enfin bon l'interprétation est faite par le shell (comme avec system), et non pas au plus bas niveau avec les exec*, mais  ça change pas grand chose en fait donc bon.
  • MathMath Membre
    11:00 modifié #7
    Ok, merci beaucoup Ali et maconnect, je vais regarder tout ça.

Connectez-vous ou Inscrivez-vous pour répondre.