#!/usr/local/bin/perl
use threads;
use threads::shared;
use POSIX::RT::Semaphore;
$sem = POSIX::RT::Semaphore->init(0, 0);
my $pid = fork;
if ( $pid == 0 )
{
$sem->wait;
print "CODE2\n";
exit;
}
print "CODE1\n";
$sem->post;
Я вижу только CODE1
Почему в дочернем процессе блокировка остаётся после того как в родительском сделан post и значение увеличено на 1
Мне надо лишь чтобы CODE1 было выведено
раньше чем CODE2
Имеется хэш, где ключи - строки, а значения - ссылки на массивы строк.
Этот хэш - временный буффер, который
необходимо сбрасывать в файл, на консоль, в
syslog и куда угодно ещё по прошествии
заданного периода (60 сек).
Прога читает из сокета udp датаграммы и пишет некую инфу из них в этот хэш.
Операция одновременного сбрасывания буффера
в различные "устройства" достаточно длительная
и следовательно если делать её после
прошествия 60 секунд, то часть датаграмм
может потеряться.
Поэтому я хочу создавать новый процесс, в
котором и сбрасывать буфер, а одновременно
с старом процессе будет работать первичный
сбор данных в буфер(!!!)
ВОПРОС:
После выполнения fork - как два процесса
будут разделять память в которой хранится
хэш (помните про значения-ссылки в нём).
При чтении новой 60-ти секундной проции
данных я предварительно обнуляю хэш.
Не получится ли так, что обнулив хэш в
родителе, я автоматом обнулю его и в потомке
не успев ещё сбросить его в файлы???
Есть задачка:
IP адресу хочу поставить в соответствие все
его символьные названия.
Т.е. например
127.0.0.1 --- localhost, my_comp, develop_st
и т. д.
Хочу сделать хэш, где ключи - IP адреса, а
значения - массивы имён(или ссылки на массивы
имён)
Это естественно не работает:
%my_hash = ();
push $my_hash{"127.0.0.1"} "localhost";
push $my_hash{"127.0.0.1"} "my_comp";
push $my_hash{"127.0.0.1"} "develop_st";
Как сделать правильно?
Вот кусочек кода
.
.
.
my $socket = IO::Socket::INET -> new (
PeerAddr => '192.168.250.1',
LocalPort => 9996,
Proto =>'udp'
) or die "$!\n";
my $port = $socket -> peerport();
my $host = $socket -> peerhost();
my $host2 = $socket -> sockhost();
my $port2 = $socket -> sockport();
print "port = '$port' host = '$host' port2
= '$port2' host2 = '$host2' \n";
while (1)
{
my $from = $socket -> recv (my $data, 8192, 0);
if (length ($data) < 16) {
warn ("Invalid packet length " . length ($data) .
" received\n");
next;
}
my ($version, $flows, $uptime, $secs, $usecs) = unpack ('nnNNN', $data);
print "*************************************************\n";
#my $len = length ($data);
print("version = '$version'\n");
print("flows = '$flows'\n");
print("uptime = '$uptime'\n");
print("secs = '$secs'\n");
print("usecs = '$usecs'\n");
print "*************************************************\n";
}
.
.
.
Есть Cisco 1700 - адрес 192.168.250.1
Порт данных 9996
Хочется читать данные
Для этого создаю сокет
Обратите внимание на то, как создаётся
сокет!!!
Я указываю PeerAddr И LocalPort(!)
И это работает, но я не понимаю как!
Ведь я просто создаю клиента и должен действовать по схеме
socket
connect
recv|send
На кой указывать LocalPort???
Если указать PeerPort 9996 - не работает!
В чём моя ошибка?
Сейчас я спокойно захожу на lor из дома
Однако уже почти неделю с работы я не могу зайти на lor (он даже не
пингуется).
Т.к. все остальные сайты работают можно предположить что мне закрыт
доступ по ip (217.15.21.170)
Так ли это??? Если да то почему закрыли и когда откроют!!!!
Надо из строки удалить все "-" и ":"
В два этапа это сделать элементарно!
А как записать в одну строчку? Наверное тоже очень просто!
#!/usr/local/bin/perl
$str = "2005-03-04_12:00";
$str =~ s/-//g; # regex 1
$str =~ s/://g; # regex 2
print $str . "\n";
Подскажите open source проект написанный на "чистом" C++ - т.е. имеется
ввиду достаточно простое консольное приложение (без всяких там
графических фич).
Хотелось бы просто посмотреть код, как другие пишут.
Вопрос по bind 9
Если сервер кэширующий то он хранит результаты запросов в памяти, не
сбрасывая информацию на диск.
А если я перезапускаю named - весь кэш пропадёт???
Как сохранять его в файле???
Как мне в perl программе обрабатывать все сигналы.
Пусть хотя бы на уровне записи в лог.
Например если случился SIGSEGV то писать в лог и корректно выходить!
Простой пример
...
$sth->execute() or die; # Работает
...
И простой контрпример
...
$sth->execute() or {logg("Error"); die;} # НЕ Работает
...
Почему после or нельзя юзать блок операторов???
На perl-е пишу скрипт.
Необходимо проверить могу ли я создать файл $my_file в append mode
Проверяю так:
Если (есть файл И в него нельзя писать) ИЛИ (нет файла И нельзя писать
в директорию) то выводим ошибку и выходим
Вот код:
if ( (-e $my_file and ! -w $my_file) or ( ! -e $my_file and ! -w `dirname $my_file`) )
{
print stderr "ERROR : permission denied\n";
exit 5;
}
Не работает! В директорию есть возможность записи и файла нет - всё
равно выдаёт ошибку!!!
В чём проблема???
Мне необходимо чтобы
hello == HeLlo
возвращало true
Есть ли способ сделать это стандартными средcтвами perl?
Если нет, то может модуль есть какой-нибудь?