Да, это может быть сделано, пока оба окна находятся на том же домене. window.open () функция возвратит дескриптор новому окну. Дочернее окно может получить доступ к родительскому окну с помощью элемента DOM "новичок".
В Perl вы можете использовать seek
и tell
для чтения из постоянно растущего файла. Это может выглядеть примерно так (широко заимствовано из perldoc -f seek
)
open(FH,'<',$the_file) || handle_error(); # typical open call
for (;;) {
while (<FH>) {
# ... process $_ and do something with it ...
}
# eof reached on FH, but wait a second and maybe there will be more output
sleep 1;
seek FH, 0, 1; # this clears the eof flag on FH
}
В Perl есть несколько модулей, которые упрощают отслеживание файла. IO :: Tail и File :: Tail один использует обратный вызов, другой - блокирующее чтение, так что это просто зависит от того, что лучше соответствует вашим потребностям. Вероятно, существуют и другие хвостовые модули, но это два, которые пришли в голову.
IO :: Tail - следовать за хвостом файлов / потока
use IO::Tail;
my $tail = IO::Tail->new();
$tail->add('test.log', \&callback);
$tail->check();
$tail->loop();
File :: Tail - расширение Perl для чтение из постоянно обновляемых файлов
use File::Tail;
my $file = File::Tail->new("/some/log/file");
while (defined(my $line= $file->read)) {
print $line;
}
Вы говорите об открытии файла и спрашиваете о IO :: Socket
. Это не совсем то же самое, даже если в глубине души вы собираетесь читать данные из файлового дескриптора.
Если вы можете получить доступ к удаленному потоку из именованного канала или FIFO, вы можете просто открыть его как обычный файл. Он будет блокироваться, когда ничего не доступно, и возвращаться всякий раз, когда есть данные, которые необходимо удалить. Возможно, вам придется использовать File :: Tail
, а может и нет, чтобы решить проблему сохранения данных, если отправитель окажется слишком далеко впереди вас.
С другой стороны, если вы ' При открытии сокета напрямую другому серверу (что кажется более вероятным), IO :: Socket
не будет работать из коробки, поскольку недоступен метод getline
. Вам нужно будет читать и буферизовать блок за блоком, а затем отдавать его построчно через промежуточное перо удержания.
Вы можете вытащить дескриптор сокета в IO :: Handle
, и используйте для этого getline ()
. Что-то вроде:
my $sock = IO::Socket::INET->new(
PeerAddr => '172.0.0.1',
PeerPort => 1337,
Proto => 'tcp'
) or die $!;
my $io = new IO::Handle;
$io->fdopen(fileno($sock),"r") or die $!;
while (defined( my $data = $io->getline() )) {
chomp $data;
# do something
}
Возможно, вам придется выполнить рукопожатие, чтобы начать прием пакетов, но это другое дело.
В python это довольно просто:
f = open('teste.txt', 'r')
for line in f: # read all lines already in the file
print line.strip()
# keep waiting forever for more lines.
while True:
line = f.readline() # just read more
if line: # if you got something...
print 'got data:', line.strip()
time.sleep(1) # wait a second to not fry the CPU needlessy
Решения читать весь штраф до конца - неразумно с точки зрения производительности. Если это произойдет под Linux, я бы предложил просто переименовать файл журнала. Затем вы можете сканировать все объекты в переименованном файле, а те, что в исходном файле, будут снова заполнены. Просканировав весь переименованный файл - удалите его. Или двигайтесь, куда хотите. Таким образом вы получите что-то вроде logrotate, но для сканирования только что поступающих данных.