objective-c - tutorial - objective c windows




Quel est le meilleur moyen d'écrire une application Cocoa dans une application Erlang? (4)

Une façon serait de faire en sorte que le cœur d'Erlang de l'application soit un démon avec lequel l'interface Cocoa communique avec une socket de domaine Unix en utilisant un protocole simple.

L'utilisation d'une socket de domaine Unix signifie que le démon Erlang peut être lancé à la demande par launchd et que le frontal Cocoa peut trouver le chemin d'accès au socket à utiliser via une variable d'environnement. Cela rend le rendez-vous entre l'application et le démon trivial, et il est aussi simple de développer plusieurs frontaux (ou peut-être un cadre qui enveloppe la communication avec le démon).

Le système de launchd Mac OS X est vraiment cool de cette façon. Si vous spécifiez qu'un travail doit être lancé à la demande via un socket de domaine Unix sécurisé, launchd créera le socket lui-même avec les autorisations appropriées et annoncera son emplacement via la variable d'environnement nommée dans la liste de propriétés du travail. Le travail, lorsqu'il est démarré, sera effectivement passé un descripteur de fichier à la socket par launchd quand il effectue un simple enregistrement.

En fin de compte cela signifie que tout le processus d'ouverture de la socket pour communiquer avec le démon, lancer le lancement du démon et le démon répondant à la communication peut être sécurisé, même si le frontal et le démon fonctionnent avec des privilèges différents les niveaux.

J'explore la possibilité d'écrire une application dans Erlang, mais il faudrait en avoir une partie écrite dans Cocoa (vraisemblablement Objective-C). Je voudrais que le frontal et le back-end puissent communiquer facilement. Comment cela peut-il être mieux fait?

Je peux penser à utiliser des ports C et des processus connectés, mais je pense que j'aimerais une situation inverse (le démarrage et la connexion au back-end). Il existe des canaux nommés (FIFO), ou je pourrais utiliser des communications réseau sur un port TCP ou un socket BSD nommé. Est-ce que quelqu'un a de l'expérience dans ce domaine?


Les approches de socket de domaine NSTask et Unix sont toutes deux d'excellentes suggestions. Quelque chose à surveiller est une mise en œuvre d'Erlang FFI qui est en cours:

http://muvara.org/crs4/erlang/ffi


En utilisant NSTask, vous pouvez également utiliser PseudoTTY.app (qui permet une communication interactive)!

Un autre exemple de code d'intérêt pourrait être BigSQL, un client PostgreSQL qui permet à l'utilisateur d'envoyer du SQL à un serveur et d'afficher le résultat.

open -a Safari http://web.archive.org/web/20080324145441/http://www.bignerdranch.com/applications.shtml

Habituellement, lorsque vous créez des applications Cocoa qui exécutent des commandes UNIX ou d'autres programmes sans NSTask vous utilisez un NSTask :

En utilisant la classe NSTask, votre programme peut exécuter un autre programme en tant que sous-processus et peut surveiller l'exécution de ce programme. Un objet NSTask crée une entité exécutable distincte; il diffère de NSThread en ce sens qu'il ne partage pas l'espace mémoire avec le processus qui le crée.

Une tâche fonctionne dans un environnement défini par les valeurs actuelles pour plusieurs éléments: le répertoire en cours, l'entrée standard, la sortie standard, l'erreur standard et les valeurs de toutes les variables d'environnement. Par défaut, un objet NSTask hérite de son environnement du processus qui le lance. Si des valeurs doivent être différentes pour la tâche, par exemple, si le répertoire en cours doit changer, vous devez modifier la valeur avant de lancer la tâche. L'environnement d'une tâche ne peut pas être modifié pendant son exécution.

Vous pouvez communiquer avec le processus backend via stdin / stdout / stderr . Basiquement NSTask est un wrapper de haut niveau autour d' exec (ou fork ou system , j'oublie toujours la différence).

Si je comprends bien, vous ne voulez pas que le programme Erland soit un démon de fond qui fonctionne continuellement, mais si vous le faites, suivez la suggestion de Chris .







erlang