Lancement d'une commande via system(1,"$cmd");
Résolu/Fermé
Alexis
-
12 mars 2013 à 18:14
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 14 mars 2013 à 15:03
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 14 mars 2013 à 15:03
A voir également:
- Perl system return code
- Reboot system now - Guide
- Le code ascii - Guide
- Code puk bloqué - Guide
- Code telephone oublié - Guide
- Code activation windows 10 - Guide
3 réponses
Bon finalement j'ai réussi à résoudre mon problème en utilisant un fork() de la manière suivante.
Mon code fonctionne maintenant normalement sous Windows et sous Unix
Merci pour votre aide !!! :-D
foreach my $i (1, 2, 3) { my $pid = fork(); if ($pid==0) { # child exec("perl C:\\repertoire\\test_2.pl $i"); die "Exec $i failed: $!\n"; } elsif (!defined $pid) { warn "Fork $i failed: $!\n"; } }
Mon code fonctionne maintenant normalement sous Windows et sous Unix
Merci pour votre aide !!! :-D
[Dal]
Messages postés
6204
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
27 février 2025
1 102
Modifié par [Dal] le 13/03/2013 à 11:31
Modifié par [Dal] le 13/03/2013 à 11:31
Bonjour Alexis,
Avec Perl, pour lancer une commande système sans attendre son retour, tu dois utiliser exec :
https://perldoc.perl.org/functions/exec
Ce que tu utilises est une particularité du portage de Perl de la commande system sous Windows, signalée ainsi par perlport (https://perldoc.perl.org/perlport#system)
Cela n'est pas du Perl portable https://perldoc.perl.org/functions/system et c'est normal que cela ne fonctionne que sous Win32.
Dal
Avec Perl, pour lancer une commande système sans attendre son retour, tu dois utiliser exec :
https://perldoc.perl.org/functions/exec
Ce que tu utilises est une particularité du portage de Perl de la commande system sous Windows, signalée ainsi par perlport (https://perldoc.perl.org/perlport#system)
As an optimization, may not call the command shell specified in $ENV{PERL5SHELL} . system(1, @args) spawns an external process and immediately returns its process designator, without waiting for it to terminate. Return value may be used subsequently in wait or waitpid. Failure to spawn() a subprocess is indicated by setting $? to "255 << 8". $? is set in a way compatible with Unix (i.e. the exitstatus of the subprocess is obtained by "$?>> 8", as described in the documentation). (Win32)
Cela n'est pas du Perl portable https://perldoc.perl.org/functions/system et c'est normal que cela ne fonctionne que sous Win32.
Dal
Merci pour ces précisions concernant l'utilisation de system().
J'avais bien pensé à l'utilisation du exec() mais je souhaiterai en lancer plusieurs à la suite sans sortir de mon programme. Or d'après ce que j'ai pu lire sur le net et les tests que j'ai pu faire avec le exec(), ce n'est pas faisable?
Sauf s'il y a une utilisation particulière dont je n'ai pas connaissance... (ce qui est fort possible)
Aurais tu une solution à ce problème ?
Merci d'avance ;)
J'avais bien pensé à l'utilisation du exec() mais je souhaiterai en lancer plusieurs à la suite sans sortir de mon programme. Or d'après ce que j'ai pu lire sur le net et les tests que j'ai pu faire avec le exec(), ce n'est pas faisable?
Sauf s'il y a une utilisation particulière dont je n'ai pas connaissance... (ce qui est fort possible)
Aurais tu une solution à ce problème ?
Merci d'avance ;)
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
13 mars 2013 à 12:27
13 mars 2013 à 12:27
utilise system à un argument (standard) mais ajoute un "&" à la fin de ta ligne de commande.
C'est comme ça que je fais et ça fonctionne bien.
C'est comme ça que je fais et ça fonctionne bien.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
13 mars 2013 à 20:53
13 mars 2013 à 20:53
system("perl C:\\repertoire\\test_2.pl $i&");
[Dal]
Messages postés
6204
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
27 février 2025
1 102
Modifié par [Dal] le 14/03/2013 à 13:46
Modifié par [Dal] le 14/03/2013 à 13:46
Cela fonctionne sous Linux, et une console Unix (avec des répertoires corrects).
Mais, en faisant
Ou alors, j'ai raté un truc, ce qui est possible :-)
Dal
Mais, en faisant
perl -e 'sleep(10); print "Hello, world!\n"' &dans une console "cmd" sous Windows XP, cela ne me détache pas le processus chez moi.
Ou alors, j'ai raté un truc, ce qui est possible :-)
Dal
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
14 mars 2013 à 15:03
14 mars 2013 à 15:03
ça fonctionne sous Linux, c'était ça le problème, de le faire fonctionner sous Linux...
C'est sur qu'une solution portable c'est mieux.
C'est sur qu'une solution portable c'est mieux.