do shell script "....

tabliertablier Membre
04:57 modifié dans API AppKit #1
2 questions:

quel est l'équivalent en Objective-C de: do shell script "ps -cx" d'applescript

lorsque j'exécute le do shell script, j'arrive à  trouvé une description de l'apple event:
AE:  'syso'  ID: 'exec'  {'----':"ps -cx", &'subj':''null''(),  .......... etc

mais je n'arrive pas à  déterminer le destinataire de l'AE.  Quelqu'un aurait une idée?

Réponses

  • AliGatorAliGator Membre, Modérateur
    décembre 2006 modifié #2
    Hello,
    • La commande "do shell script" d'AppleScript permet d'executer des commandes terminal.
    • Donc ta question serait plutôt : "comment executer des commandes terminal en Cocoa". Et la réponse est NSTask.
      En faisant une recherche sur NSTask (sur google ou même ici, puisqu'on en a déjà  parlé) tu trouveras ton bonheur et en particulier des exemples types pour executer un commande terminal, dans ton exemple la commande "ps" avec les arguments "cx".
    • Du coup, plus du tout de rapport avec AppleScript : tu ne vas quand même pas utiliser Cocoa pour appeler un AppleScript qui va appeler une commande terminal, alors que Cocoa sait appeler une commande terminal directement.
    • Mais Cocoa sait faire encore mieux : il sait te retourner la liste des process lancés. Directement dans un NSArray. C'est quand même plus sympa que d'appeler la commande terminal, autant aller à  la source, non ?
      Par contre je ne sais plus exactement quelle classe permet ça (je pensais à  NSWorkspace mais ça n'a pas l'air d'être ça) mais bon, en cherchant bien dans la doc ça se retrouve.


    Une bonne adresse à  lire en tout cas
  • tabliertablier Membre
    04:57 modifié #3
    J'avais bien supposé la direction, mais je me suis perdu en route et je n'ai pas du en lire suffisament!! bon, j'y retourne.
    Pour info:  Mon problème est en fait de trouver la bonne information sur une application (process) que je lance (launchApplication:), pour pouvoir écrire un descripteur d'adresse et lui envoyer quelques milliers d'AppleEvents. Donc il me faut soit son PID, soit son PSN.

    Question subsidiaire: PID et PSN sont-ils uniques lors d'une session?
    CaD: Si je ferme une application, son PID disparait. Sera-t-il réutilisé par le system dans la même session?
  • AliGatorAliGator Membre, Modérateur
    décembre 2006 modifié #4
    Normalement tu as un Process Descriptor... Mais c'est vrai que NSWorkspace ne te fournit rien d'autre en retour de launchApplication qu'un BOOL pour dire OK ou pas...

    Maintenant :

    1) Le PID n'est pas unique par session : rien ne dit qu'un PID qui a déjà  été utilisé (mais ne l'est plus) ne sera pas réutilisé plus tard, même dans la même session. En pratique, en général, les numéros de PID s'incrémentent (tu lances une appli A qui a un PID P, si tu lances une autre appli ensuite, il aura certainement le PID P+1, etc), mais c'est juste une constatation, et la seule règle imposée par UNIX c'est que lse PID soient unique, c'est à  dire qu'à  tout moment chaque PID utilisé ne le soit que par un seul process. D'après cette règle, si un process est quitté, son PID pourra être réutilisé donc.

    2) Normalement les AppleEvents sont envoyés à  une appli identifiée par son nom (ou son bundleidentifier ou son code créateur). Donc c'est plutôt ce genre d'info qu'il te faut, qu'un PID.
    Ces identifiants (nom, bundleIdentifier, ou code créateur) sont communes à  toutes les instances de cette appli (si plusieurs instances il y a... ce qui en pratique en général n'est pas possible, du moins si tu lances ton appli par le Finder), et même à  toutes les versions (si tu as 2 versions d'une même appli, à  2 endroits différents sur ton disque, cette appli aura sans doute le même nom, en tout cas le même code créateur et le même BundleIdentifier pour les 2 versions). Si tu lances cette appli, que tu la quittes, la relance, la requitte, etc, ces identifiants là  ne changeront pas, contrairement au PID par exemple, qui lui changera à  chaque lancement.

    Et de toute façon ça tombe bien puisque c'est avec ces identifiants (nom de l'appli, ou alors bundleIdentifier, ou alors code créateur), à  la fois :
    - que tu appelle launchApplication de la classe NSWorkspace
    - que tu indique le destinataire de ton AppleEvent (dans la structure de l'AppleEvent il y a un endroit pour mettre le code créateur de l'appli destinataire)

    Donc finalement, le PID, je ne pense pas qu'il te soit trop utile... (ni le PSN d'ailleurs)
  • ClicCoolClicCool Membre
    04:57 modifié #5
    dans 1165481238:

    Hello,
    • Mais Cocoa sait faire encore mieux : il sait te retourner la liste des process lancés. Directement dans un NSArray. C'est quand même plus sympa que d'appeler la commande terminal, autant aller à  la source, non ?
      Par contre je ne sais plus exactement quelle classe permet ça (je pensais à  NSWorkspace mais ça n'a pas l'air d'être ça) mais bon, en cherchant bien dans la doc ça se retrouve.



    Si si cher Ali t'as raison ,
    c'est bien avec NSWorkspace qu'on peut obtenir cette liste il me semble.

    launchedApplications
    Returns an array of dictionaries, one entry for each running application.

    - (NSArray *)launchedApplications

    Return Value
    An array of NSDictionary objects. Each dictionary contains as many of the keys described in ?Constants? as are available.

    See Also
    ? activeApplication
    Availability
    Available in Mac OS X v10.2 and later.
  • tabliertablier Membre
    04:57 modifié #6
      Comme toujours, vos réponses me permettent de trouver des solutions, mais aussi font apparaitre de nouvelles questions!! (merci pour les solutions )

    D'après vos réponses, je ne vois pas comment savoir qu'une application a été fermée puis réouverte. Je pensais comparer les PID pris à  deux instants différents. Mais d'après vos observations sur le PID cela ne parait pas la bonne solution.
    Y-a-t-il une manière de faire cela?
  • ClicCoolClicCool Membre
    04:57 modifié #7
    Pourquoi n'observes-tu pas tout bêtement les notifications distribuées ?

    Par ex.:
    NSWorkspaceDidTerminateApplicationNotification est accompagné d'un NSDic comprenant le PID le nom de l'appli., son Path etc...
    De même que NSWorkspaceDidLaunchApplicationNotification.

    En observant en continue ces notifications, rien ne t'échappe sur les appli lancées ou quittées en direct.

    T'as même un NSWorkspaceWillLaunchApplicationNotification qui contient les mêmes infos et t'averti carrément avant le lancement réel de l'appli.
Connectez-vous ou Inscrivez-vous pour répondre.