Как я могу повторно инициализировать STDIN/STDOUT/STDERR Perl?

Google творит чудеса.

Это иврит для "двойного двоеточия".

16
задан brian d foy 28 August 2009 в 18:44
поделиться

3 ответа

Если это все еще полезно, на ум приходят две вещи:

  1. Вы можете закрыть STDOUT / STDERR / STDIN только в дочернем процессе (например, if (! Fork ()). Это позволит родитель, чтобы по-прежнему использовать их, потому что они все еще будут там открыты.

  2. Я думаю, вы можете использовать более простое закрытие (STDOUT) вместо того, чтобы открывать его в /dev/null.

. Например:

if (!fork()) {
    close(STDIN) or die "Can't close STDIN: $!\n";
    close(STDOUT) or die "Can't close STDOUT: $!\n";
    close(STDERR) or die "Can't close STDERR: $!\n";
    do_some_fork_stuff();
}
5
ответ дан 30 November 2019 в 21:46
поделиться

После закрытия нет возможности вернуть его.

Зачем вам снова нужен STDOUT? Писать сообщения в консоль? Используйте для этого / dev / console или пишите в системный журнал с помощью Sys :: Syslog.

Честно говоря, другой ответ верен. Вы должны сохранить старый stdout (клонированный в новый fd), если хотите снова открыть его позже. Это действительно решает проблему "зомби", поскольку затем вы можете перенаправить fd 0 (и 1 и 2) в /dev/null.

4
ответ дан 30 November 2019 в 21:46
поделиться

# копия дескрипторов файлов

open(CPERR, ">&STDERR");

# перенаправление stderr в файл предупреждения

open(STDERR, ">>xyz.log") || die "Error stderr: $!";

# закрытие перенаправленных дескрипторов файлов

close(STDERR) || die "Can't close STDERR: $!";

# восстановление stdout и stderr

open(STDERR, ">&CPERR") || die "Can't restore stderr: $!";

# Надеюсь, это сработает для вас.

# - Hariprasad AJ

15
ответ дан 30 November 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: