Почему я получаю ошибку сегментации, когда я использую binmode с потоками в Perl? - PullRequest
3 голосов
/ 15 апреля 2010

этот звонок

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

отлично работает. Но как только я добавлю

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

к моему файлу скрипта я получаю сообщение об ошибке «ошибка сегментации», «доступ запрещен».

Что плохого в определении типа кодировки при попытке вызвать поток Perl?

Пример:

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 @_;
}

Этот код не работает для меня.

С уважением

- Энди

Ответы [ 3 ]

3 голосов
/ 15 апреля 2010

Об этом сообщалось как ошибка в трекере ошибок Perl . У меня такая же ошибка на 5.12 RC0 на Windows.

3 голосов
/ 15 апреля 2010

Во-первых, обратите внимание, что наличие подпрограммы print с тем же именем, что и у встроенной функции , может вызвать большую путаницу (если не perl определенно для вас или любого, кто нужно прочитать ваш код).

Во-вторых, я не наблюдаю проблему с:

#!/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 @_;
}

Выход:

C:\Temp> t
Hello thread World!

Однако, поскольку STDOUT является переменной пакета, я бы не рекомендовал делать что-либо подобное.

Вы должны опубликовать короткий, но полный сценарий, в котором описана проблема, а не биты и кусочки, а также описано, что вы пытаетесь сделать, а не просто механические действия.

2 голосов
/ 15 октября 2012
#!/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();

Вышеуказанные ошибки в Perl 5.12.4 в строке 'B'. Если вы поменяете местами строки «A» и «B», код работает нормально. Он также работает нормально, если вы закрываете $ fh перед созданием потока. Поэтому до тех пор, пока эта проблема не будет решена, просто убедитесь, что у вас нет открытых файловых дескрипторов, для которых у вас есть бинмодированные кодировки, при создании нового потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...