Google творит чудеса.
Это иврит для "двойного двоеточия".
Если это все еще полезно, на ум приходят две вещи:
Вы можете закрыть STDOUT / STDERR / STDIN только в дочернем процессе (например, if (! Fork ()). Это позволит родитель, чтобы по-прежнему использовать их, потому что они все еще будут там открыты.
Я думаю, вы можете использовать более простое закрытие (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();
}
После закрытия нет возможности вернуть его.
Зачем вам снова нужен STDOUT? Писать сообщения в консоль? Используйте для этого / dev / console или пишите в системный журнал с помощью Sys :: Syslog.
Честно говоря, другой ответ верен. Вы должны сохранить старый stdout (клонированный в новый fd), если хотите снова открыть его позже. Это действительно решает проблему "зомби", поскольку затем вы можете перенаправить fd 0 (и 1 и 2) в /dev/null.
# копия дескрипторов файлов
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