2009-10-20 6 views
2

En Perl, sans utiliser la bibliothèque Thread, quel est le moyen le plus simple de générer un appel système pour qu'il ne soit pas bloquant? Pouvez-vous le faire en évitant également fork()?En Perl, comment faire un appel système non bloquant?

EDIT Clarification. Je veux éviter un appel explicite et désordonné à la fourchette.

+0

Quel système d'exploitation/plate-forme? –

+0

J'utilise linux. –

+1

Fork est l'idiome de l'OS pour les processus - il n'y a aucune raison d'éviter de forker sur les systèmes nix. Mais il y a toujours des raisons d'encapsuler et d'homogénéiser les points d'accès. – Axeman

Répondre

9

Voulez-vous dire par là?

system('my_command_which_will_not_block &'); 

Comme Chris Kloberdanz souligne, cela appelle fork() implicitement - il n'y a vraiment pas d'autre moyen pour perl de le faire; en particulier si vous voulez que l'interpréteur perl continue à fonctionner pendant que la commande s'exécute.

Le caractère & dans la commande est une méta-caractères shell - perl voit et passe l'argument system() à la coque (généralement bash) pour l'exécution, plutôt que de l'exécuter directement avec un appel execv(). & indique à bash de fourcher à nouveau, exécutez la commande en arrière-plan et quittez immédiatement, en renvoyant le contrôle à perl pendant que la commande continue à s'exécuter.

+0

Le système n'utilise-t-il pas implicitement fork()? –

+0

Clarification. Je veux éviter un appel explicite et désordonné à la fourchette. –

+1

** Soupir ** I * guess * un "appel système non-bloquant" * pourrait * signifier que. –

4

Le post ci-dessus dit "il n'y a pas d'autre moyen pour perl de le faire", ce qui n'est pas vrai.

Depuis que vous avez mentionné la suppression de fichier, jetez un oeil à IO::AIO. Cela effectue les appels système dans un autre thread (thread POSIX, pas Perl pseudothread); vous planifiez la demande avec aio_rmtree et quand cela est fait, le module appellera une fonction dans votre programme. En attendant, votre programme peut faire tout ce qu'il veut.

Faire des choses dans un autre thread POSIX est en fait une technique généralement utile. (Une version piratée spéciale de) Coro l'utilise pour anticiper les coroutines (time slicing), et EV :: Loop :: Async l'utilise pour envoyer des notifications d'événements même lorsque Perl fait autre chose que d'attendre des événements.

Questions connexes