Perl, GhostScript и STDIN, STDOUT

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
TITANius
сержант
Сообщения: 197
Зарегистрирован: 2009-10-27 11:33:10

Perl, GhostScript и STDIN, STDOUT

Непрочитанное сообщение TITANius » 2012-02-24 12:45:57

Подскажите как с помощью perl'а скормить ghostscript'у файл из переменной, и вернуть результат опять же в переменную, не записывая при этом на диск промежуточные варианты.

Я так понимаю что вызов ghostscript'а будет слудеющей строкой:

Код: Выделить всё

gs -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=%stdout -
Но как средствами perl'а передать в скрипт информацию при этом получая от неё результат не нагуглил :st:
Поможите кто чем может :) ... заранее благодарен :drinks:

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
thefree
лейтенант
Сообщения: 980
Зарегистрирован: 2008-12-29 9:23:19
Откуда: Весёлая Страна

Re: Perl, GhostScript и STDIN, STDOUT

Непрочитанное сообщение thefree » 2012-03-02 8:56:52

perldoc system и exec
Не судите меня строго, Я не волшебник, а только учусь!
http://planetbsd.ru - RSS-агрегатор *BSD по Рунету

Аватара пользователя
TITANius
сержант
Сообщения: 197
Зарегистрирован: 2009-10-27 11:33:10

Re: Perl, GhostScript и STDIN, STDOUT

Непрочитанное сообщение TITANius » 2012-03-03 1:54:38

thefree писал(а):perldoc system и exec
премного благодарен :) ... очень помогли :)

вопчем путём мучений родился этот код:

Код: Выделить всё

#!/usr/bin/perl

use strict;
use IPC::Open2;

my $output = '... postscript code ....';
local $| = 1;
my($chld_out, $chld_in);
my $pid = open2($chld_out, $chld_in, "/usr/local/bin/gs -dBATCH -dNOPAUSE -dQUIET -sDEVICE=jpeg -sOutputFile=%stdout -_");
print $chld_in "$output\n" or die $!;
close $chld_in  or die $!;
undef $output;
while( <$chld_out> ) { $output .= $_ }
close $chld_out or die $!;
waitpid( $pid, 0 );
print $output;
Всё вроде бы ничего, но! ... при больших исходящих файлах считывание данных ограничивается на ~48...60 Кб ... т.е. передача данных обрывается.

Вопрос знатокам. Есть какие-то ограничения по выводу что ли ?

P.S.:

Код: Выделить всё

$ limits
Resource limits (current):
  cputime              infinity secs
  filesize             infinity kB
  datasize             33554432 kB
  stacksize              524288 kB
  coredumpsize         infinity kB
  memoryuse            infinity kB
  memorylocked         infinity kB
  maxprocesses             5547
  openfiles               11095
  sbsize               infinity bytes
  vmemoryuse           infinity kB
  pseudo-terminals     infinity
  swapuse              infinity kB

Код: Выделить всё

$ ulimit -a
socket buffer size       (bytes, -b) unlimited
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) 33554432
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 11095
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 524288
cpu time               (seconds, -t) unlimited
max user processes              (-u) 5547
virtual memory          (kbytes, -v) unlimited
swap size               (kbytes, -w) unlimited

Код: Выделить всё

$ sysctl -a |grep pipe
kern.ipc.piperesizeallowed: 1
kern.ipc.piperesizefail: 0
kern.ipc.pipeallocfail: 0
kern.ipc.pipefragretry: 0
kern.ipc.pipekva: 933888
kern.ipc.maxpipekva: 66506752

Код: Выделить всё

$ uname -a
FreeBSD ... 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Mon Feb  6 15:26:21 EET 2012
... т.е. не вижу нигде цифр в районе ~48...60 КБ (

Аватара пользователя
TITANius
сержант
Сообщения: 197
Зарегистрирован: 2009-10-27 11:33:10

Re: Perl, GhostScript и STDIN, STDOUT

Непрочитанное сообщение TITANius » 2012-03-03 2:10:29

По методике многоуважаемого человека

сделал тест "pipe capacity ":

Код: Выделить всё

write size:          1; bytes successfully before error: 65536
write size:          2; bytes successfully before error: 65536
write size:          4; bytes successfully before error: 65536
write size:          8; bytes successfully before error: 65536
write size:         16; bytes successfully before error: 65536
write size:         32; bytes successfully before error: 65536
write size:         64; bytes successfully before error: 65536
write size:        128; bytes successfully before error: 65536
write size:        256; bytes successfully before error: 65536
write size:        512; bytes successfully before error: 65536
write size:       1024; bytes successfully before error: 65536
write size:       2048; bytes successfully before error: 65536
write size:       4096; bytes successfully before error: 65536
write size:       8192; bytes successfully before error: 8192
write size:      16384; bytes successfully before error: 16384
write size:      32768; bytes successfully before error: 32768
write size:      65536; bytes successfully before error: 65536
write size:     131072; bytes successfully before error: 0
write size:     262144; bytes successfully before error: 0
итого получается ограничение буфера PIPE на 64Кб ... как его увеличить ? :)

Аватара пользователя
TITANius
сержант
Сообщения: 197
Зарегистрирован: 2009-10-27 11:33:10

Re: Perl, GhostScript и STDIN, STDOUT

Непрочитанное сообщение TITANius » 2012-03-03 2:57:24

Замельтишил я на форуме ...

Решил я проблему с 64 Кб, переписал перебор выходящих данных:

Код: Выделить всё

#!/usr/bin/perl

use strict;
use IPC::Open2;

my $output = '... postscript code ....';
local $| = 1;
my($chld_out, $chld_in);
my $pid = open2($chld_out, $chld_in, "/usr/local/bin/gs -dBATCH -dNOPAUSE -dQUIET -sDEVICE=jpeg -sOutputFile=%stdout -_");
print $chld_in "$output\n" or die $!;
close $chld_in  or die $!;
my @output = <$chld_out>;
close $chld_out or die $!;
waitpid( $pid, 0 );
$output = join '', @output;