2010-04-15 6 views
3

cet appelPourquoi ai-je une erreur de segmentation lorsque j'utilise binmode avec des threads en Perl?

my $th = threads->create(\&print, "Hello thread World!\n"); 
$th->join(); 

fonctionne très bien. Mais dès que j'ajoute

binmode(STDOUT, ":encoding(ISO-8859-1)"); 

à mon fichier script, je reçois une erreur comme « erreur de segmentation », « accès refusé ».

Quel est le problème pour définir un type de codage lorsque vous essayez d'appeler un thread Perl?

Exemple:

use strict; use warnings; 
use threads; 

binmode(STDOUT, ":encoding(ISO-8859-1)"); 

my $th = threads->create(\&print, "Hello thread World!\n"); 
$th->join(); 

sub print { 
    print @_; 
} 

Ce code ne fonctionne pas pour moi.

Cordialement

--Andy

+0

Quelle est votre version de Perl et quelle architecture système utilisez-vous? – Ether

Répondre

3

D'abord, notez que d'avoir un sous-programme print avec le même nom que built-in function est susceptible de causer beaucoup de confusion (sinon perl certainement vous ou quelqu'un qui a besoin de lire votre code).

Deuxièmement, je ne respecte pas le problème avec:

#!/usr/bin/perl 

use strict; use warnings; 
use threads; 

my $th = threads->create(\&print, "Hello thread World!\n"); 
$th->join(); 

sub print { 
    binmode(STDOUT, ":encoding(ISO-8859-1)"); 
    print @_; 
} 

Sortie:

C:\Temp> t 
Hello thread World!

Cependant, étant donné STDOUT est une variable de package, je ne recommanderais pas faire quelque chose comme ça.

Vous devez publier un script court mais complet qui présente le problème plutôt que des morceaux et décrire aussi ce que vous essayez de faire plutôt que les étapes mécaniques.

+0

Mon mauvais, l'exemple avec l'impression était confus. appeler binmode dans un sous fonctionne réellement. Cela ne fonctionne pas si j'appelle binmode globalement et que j'essaie ensuite de créer un thread. J'ai mis à jour mon message avec un exemple. – jAndy

+0

@jAndy Je reçois une erreur de segmentation avec 'binmode' déplacé aussi au niveau supérieur. Je ne suis pas sûr d'avoir une solution rapide en ce moment et je dois faire d'autres choses. Je suis sûr que quelqu'un d'autre fournira plus de perspicacité pendant mon absence. –

2
#!/usr/bin/perl 
use strict; use warnings; use threads; 
open my $fh, '>>', '/tmp/1' or die $!; 
binmode $fh, ':encoding(isolatin1)' or die $!; # LINE 'A' 
my $t = threads->create(sub { sleep 1; }); # LINE 'B' 
$t->join(); 

Les sauts de page ci-dessus dans Perl 5.12.4 dans la ligne 'B'. Si vous échangez les lignes «A» et «B», le code fonctionne correctement. Il fonctionne également bien si vous fermez $ fh avant de créer le thread. Donc, jusqu'à ce que ce problème soit résolu, assurez-vous que vous n'avez pas ouvert de handles de fichiers pour lesquels vous avez des encodages binmodés, lorsque vous créez un nouveau thread.

Questions connexes