LINUX.ORG.RU

утечка памяти в вызове system

 


0

2

Привет!

Предположим, у меня есть такой скрипт:

#!/usr/bin/perl
system('someapp');

Если someapp вдруг ``течёт" - значит ли это, что после того, как он выполнится, вся утекшая память останется в наборе процесса perl'а?

Ответ на: комментарий от anonymous

глядите, что у меня есть. Есть оффтоп-три-семерочки, есть strawberry perl 5.18.win32

while (1) {
  system('rdotool');
}

Набор процесса perl.exe растет константно.

Что это значит?

belkabelka
() автор топика

Если someapp вдруг ``течёт" - значит ли это, что после того, как он выполнится, вся утекшая память останется в наборе процесса perl'а?

нет. на то он и другой процесс.

waker ★★★★★
()
Ответ на: комментарий от belkabelka

On some platforms such as Windows where the fork() system call is not available, Perl can be built to emulate fork() at the interpreter level. While the emulation is designed to be as compatible as possible with the real fork() at the level of the Perl program, there are certain important differences that stem from the fact that all the pseudo child «processes» created this way live in the same real process as far as the operating system is concerned.

http://perldoc.perl.org/perlfork.html

http://perldoc.perl.org/functions/system.html

gh0stwizard ★★★★★
()
Ответ на: комментарий от belkabelka

Что это значит?

system - это fork + exec. А fork в виндовом перле реализован через попу, то есть это по сути и не форк. Вот у тебя, например, одно из проявлений этого.

DELIRIUM ☆☆☆☆☆
()

Видимо проблема в том, что в windows someapp запускается на самом деле в рамках текущего процесса, а не нового.

Olegymous ★★★
()
Ответ на: комментарий от Olegymous
for (;;) {
	my $rrd;
	if (Win32::Process::Create($rrd, '','', 0, NORMAL_PRIORITY_CLASS, '.')) {
		$rrd->Wait(INFINITE);
	} else {
        print Win32::FormatMessage( Win32::GetLastError() );
	}
}

память утекает еще быстрее :З а ведь тут даже процесса создать не получается, поскольку аргументы заведомо неверные

belkabelka
() автор топика
Ответ на: комментарий от belkabelka
use strict;
use Win32::Process;
use Win32;

for (;;) {
	my $rrd;
	if (Win32::Process::Create($rrd, '','', 0, NORMAL_PRIORITY_CLASS, '.')) {
		$rrd->Wait(INFINITE);
	} else {
        print Win32::FormatMessage( Win32::GetLastError() );
	}
}

У меня такой скрипт не течёт. ActiveState perl 5.12.4

Olegymous ★★★
()
Ответ на: комментарий от Olegymous

ясно, сворую тогда активстейт. когда людям платят деньги - они конпеляют нормально, а в опенсурсе «зато бесплатно».

belkabelka
() автор топика
Ответ на: комментарий от Olegymous

community нельзя на продукте использовать по лицензии

belkabelka
() автор топика
Ответ на: комментарий от gh0stwizard

Ах вот зачем рекомендуется освобождать ресурсы перед завершением программы несмотря на то, что это всё равно должна сделать операционная система. Оказывается, в винде форк ниасилили.

anonymous
()

У someapp свое адресное пространство

annulen ★★★★★
()
Ответ на: комментарий от gh0stwizard

Oh shi~

Было бы логичнее, если бы функция system работала через system(3), а не через fork(2). На винде с system проблем нет.

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.