use strict; use warnings; use IO::Socket::INET; use Time::Piece; use Time::HiRes qw(sleep); use DBI; use POSIX qw(:signal_h); use threads; ################################################################################ # global variable ################################################################################ my $shost = '192.168.0.201'; my $sport = 60004; my $mhost = '192.168.0.201'; my $dbname = 'enterprise'; my $dbuser = 'root'; my $dbpasswd = '123456'; # send message sub send_message { # get message my $message = shift; # print $message, "\n"; # connect the remote server my $sock = IO::Socket::INET->new( PeerAddr => $shost, PeerPort => $sport, Proto => 'tcp' ) or die "Connect failed!"; print $sock $message; } sub get_message { # connect the mysql my $dbh = DBI->connect( "DBI:mysql:database=$dbname;host=$mhost", $dbuser, $dbpasswd, { PrintError => 0, RaiseError => 1 } ); # execute SELECT query my $sth = $dbh->prepare("SELECT IMEI FROM SessionIMEI"); $sth->execute(); # iterate through resultset # print values my @elements; while ( my $ref = $sth->fetchrow_hashref() ) { push( @elements, $ref->{IMEI} ); } my $buf = '$0'; for my $ref (@elements) { $buf .= ",$ref"; } # add the tail $buf .= "@\r\n"; # print $buf; # clean up $dbh->disconnect(); # return the message return $buf; } ########################################################################### # signal handler ########################################################################### my $sigset = POSIX::SigSet->new; my $signal = undef; # we use SIGUSR1 as the target signal $sigset->delset(&POSIX::SIGUSR1); $sigset->delset(&POSIX::SIGINT); $sigset->delset(&POSIX::SIGALRM); my $old_sigset = POSIX::SigSet->new; # load the signal handler sub user_handler { print "Get a user defined signal.\n"; $signal = shift; } sub int_handler { print "Get a interrupt signal.\n"; $signal = shift; print $signal, "\n"; } sub alarm_handler { print "Get a alarm signal.\n"; $signal = shift; } $SIG{USR1} = \&user_handler; $SIG{INT} = \&int_handler; $SIG{ALRM} = \&alarm_handler; # define the signals to block # where the old sigmask will be kept unless ( defined sigprocmask( SIG_BLOCK, $sigset, $old_sigset ) ) { die "Could not block SIGINT\n"; } # suspend until a specific signal come to process. sub sig_process { sigsuspend($sigset); my $message = undef; if ( $signal eq 'INT' ) { $message = get_message(); send_message($message); } } ########################################################################### # create threads ########################################################################### sub create_alarm { my $thr = threads->create( \&alarm_thread ); $thr->detach(); } sub alarm_thread { alarm(10); } ########################################################################### # main ########################################################################### create_alarm(); sig_process();