Насколько это серьезно, если мы не закрываем файл в Perl?

Насколько это серьезно, если мы не закрываем файл в Perl? Повлияет ли это на программу или файл, если я снова получу к нему доступ в той же программе?

 DavidO03 окт. 2012 г., 11:17
Там нет никакой гарантии, что данный "написать" сбрасывается на устройство вывода перед вызовом, чтобы закрыть дескриптор. Поэтому сохранение одного дескриптора открытым для вывода при открытии другого для того же файла может быть «чревато опасностью». Если все, что вы делаете, - это чтение, это менее важно.

Ответы на вопрос(3)

обычно рекомендуется закрывать файлыand проверьте возвращаемое значение. Как в

# open (my $fd, ">", $fname) somewhere upstream
close $fd 
    or die "Couldn't finish writing to $fname: $!";

Помимо этого, программа с радостью закроет глобальные файловые дескрипторы при выходе и лексические, когда они выходят из области видимости.

Решение Вопроса

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

Лексические файловые ручки сmy являютсяclosed когда их область оставлена / их счетчик ссылок падает до нуля.

Если имя файлового дескриптора используется повторно, предыдущий файловый дескрипторcloseбуду имплицитно. Следующий скрипт использует один и тот же дескриптор файла для печати первых пяти строк любого количества файлов:

my $fh;
foreach my $filename (@ARGV) {
  open $fh, "<", $filename or die "Can't open $filename";  # $fh is re-used
  print scalar <$fh> // next for 1 .. 5;                   # // is the defined-or
}

При работе с файлами явное закрытие FH не имеет значения. Тем не менее, это важно при выполнении IPC. Закрытие конца записи в канал указывает EOF на конец чтения.

когдаforkПри этом все неиспользуемые файловые дескрипторы должны быть закрыты, так как они дублируются при разветвлении. Это означает, что закрытие канала в одном процессе может не посылать желаемый EOF, потому что тот же канал все еще открыт в связанном процессе.

Вот программа, которая демонстрирует важностьclose в МПК:

pipe my $out, my $in or die $!;

if (fork()) {  # PARENT
  close $out;                            # close unused handle    (important!)
  select $in;
  $| = 1;                                # set $in to autoflushed (important!)
  $SIG{PIPE} = sub {die "Parent"};       # die, when the pipe is closed
  print ++$i, "\n" and sleep 1 while 1;  # print one number per second
} else {       # CHILD
  close $in;                             # close unused handle
  print scalar <$out> for 1 .. 5;        # read numbers 1 to 5 from the pipe
  close $out;                            # close the pipe (and trigger SIGPIPE)
  sleep 5;                               # wait, then exit
  die "Child";
}

Результатом этой программы являются числа от 1 до 5. Затем дочерний элемент закрывает свой конец к каналу, вызываяSIGPIPE в родительском. Пока родитель умирает, ребенок задерживается на 5 секунд, пока тоже не умрет.

Это работает, потому что родитель закрыл свой конец чтения каналу. Еслиclose $out удаляется от родителя,SIGPIPE не будет срабатывать, и программа печатает номераad infinitum.

 03 окт. 2012 г., 12:47
+1 например, где закрытие ручкиvital.

если вы не закрываете файлы.

man perlfunc:

close
           Closes the file or pipe associated with the filehandle, flushes the IO 
           buffers, and closes the system file descriptor.

Ваш ответ на вопрос