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

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

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

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

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

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

Лексические файловые ручки с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 не будет срабатывать, и программа печатает номерадо бесконечности.

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

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

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

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

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

man perlfunc:

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

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