Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2
IPC::Shareablemmap()-SystemaufrufIO::SelectNet::DaemonlibnetNet::SMTPNet::POP3Net::FTPNet::IRCLWP::*pRPC-Module
RPC::pServerRPC::pClient
# Sperrdatei anlegen, z.B. für Singleton-Eigenschaft:
sysopen(LOCKFILE, $fname, O_CREAT | O_EXCL, $mode) or die "...: $!\n";
# Signalhandler können über dem %SIG-Hash installiert werden
@SIG{qw(INT HUP TERM)} = (sub { my $sig = shift; ... }) x 3;
$SIG{'CHLD'} = sub { wait(); }; # Zombie-Killer
# Pipes und FIFOs
pipe READFH, WRITEFH or die "...";
use POSIX qw(mkfifo);
mkfifo("/tmp/afifo", 0666) or die "...";
# Semaphoren, Message-Queues und Shared Memory
use IPC::SysV;
use IPC::Semaphore;
use IPC::Msg;
$sem = new IPC::Semaphore(IPC_PRIVATE, $nsems, S_IRWXU | IPC_CREAT);
$sem->setall(@initvalues);
$sem->op($semnum, +1, $flags); # +1: V(), -1: P()
$sem->remove();
$msg = new IPC::Msg(ftok(RENDEZVOUS, RVID), S_IRWXU | IPC_CREAT);
$msg->snd($prio, $text, $flags); # $flags opt., z.B. IPC_NOWAIT
$gotprio = $msg->rcv($buf,$BUFLEN,$prio,$flags);
$msg->remove();
use IPC::Shareable; # %h in Shared Memory
tie %h, IPC::Shareable, 'glue', { create => 1, mode => 0666 };
(tied %h)->shlock();
$temp = $h{'cmplxstruct'};
push(@{ $temp }, "newvalue");
$h{'cmplxstruct'} = $temp;
(tied %h)->shunlock();
# Unix-Domain: Client und Server
$clnt = new IO::Socket::UNIX( Peer => "ux.s", Type => SOCK_STREAM );
print $clnt "hello, this is a client\n"; chomp($srvr_reply = <$clnt>);
$srvr = new IO::Socket::UNIX( Local => "ux.s", Type => SOCK_STREAM,
Listen => 5 );
$conn = $srvr->accept(); # $conn ist die Verbindung zum Client
# Unix-Domain: Datagrammkommunikation
$dgram = new IO::Socket::UNIX( Local => "dg.s", Type => SOCK_DGRAM );
$dgram->send($output, length($output));
$length = $MAXLEN; $dgram->recv($input, $length);
# UDP: verbindungslose Kommunikation
use IO::Socket; use Socket;
$udp_cli = new IO::Socket::INET( Proto => 'udp' );
$udp_srv = new IO::Socket::INET( LocalPort => $port, Proto => 'udp' );
$to_addr = sockaddr_in(getservbyname('time', 'udp'),
gethostbyname($hostname));
$udp_cli->send($buffer, $nbytes, $to_addr);
$from_addr = $udp_cli->recv($buffer, $maxlen, $flags);
$from_hostname = gethostbyaddr((sockaddr_in($from_addr))[1], AF_INET);
# TCP: verbindungsorientierte Kommunikation
$clnt = new IO::Socket::INET(PeerAddr => "www.perl.com", PeerPort => 80,
Proto => 'tcp', Timeout => 30)
or die "can't connect: $@\n"; # Beachte: $@, nicht $!
$srvr = new IO::Socket::INET(LocalPort => $portnum,
Reuse => 1, Listen => 5) or die "...";
while ($client = $srvr->accept()) {
# Verbindung über $client führen, evtl. in Kindprozess
$log="Connection from ",$client->peerhost(),":",$client->peerport();
print $client "hello, this is server!"; chomp($input = <$client>);
$client->close();
}
# Mail senden mit Net::SMTP
$smtp = Net::SMTP->new($mailhost, Hello => $mydomain, Timeout => $to);
$smtp->mail($from); $smtp->to(@receivers); # SMTP-Envelope
$smtp->data();
$stmp->datasend($header); $stmp->datasend("\n"); $smtp->datasend($body);
$smtp->dataend(); $smtp->quit();
# Mail empfangen mit Net::POP3
$pop3 = Net::POP3->new($pophost, Timeout => $to);
$pop3->login($user, $pass);
$phash = $pop3->list();
foreach my $msgnr (keys %{ $phash }) {
$msg = $pop3->get($msgnr) if $phash->{$msgnr} < $maxbytes;
$pop3->delete($msgnr); # Nachricht zum löschen markieren
}
$pop3->quit(); # markierte Nachrichten löschen, und tschüß!
# FTP: Dateien besorgen
$ftp = Net::FTP->new($ftphost); $ftp->login("anonymous", $myemailpass);
$ftp->cwd("/pub"); $ftp->binary(); $ftp->get($file, $to); $ftp->quit();
# RPC mit RPC::pClient und RPC::pServer
env-printall.pl |
Zeigt alle Umgebungsvariablen an |
env-child.pl |
Informationsübergabe mit Umgebungsvariablen |
pipe-uni.pl |
Zeigt unidirektionale Pipes Eltern => Kind |
pipe-bi.pl |
Bidirektionale Pipes Eltern <=> Kind |
fifo-server.pl |
Erzeugt eine FIFO und wartet auf Aufträge |
fifo-client.pl |
Sendet Aufträge in eine FIFO hinein |
sema-demo.pl |
Erzeuger/Verbraucher-Problem mit Semaphoren |
ipcmsg1.pl |
Erzeugt eine Message-Queue |
ipcmsg2.pl |
Füllt eine Message-Queue mit Werten |
ipcmsg3.pl |
Liest einige Einträge der Message-Queue |
ipcmsg4.pl |
Extrahiere die restlichen Elemente der Message-Queue |
ipcp1.pl |
Erzeugt ein Shared-Memory-Segment |
ipcp2.pl |
Liest und schreibt in einem SHM-Segment |
ipcp3.pl |
Liest das SHM-Segment aus und gibt es dann frei |
ipc-shareable1.pl |
Zeigt die Verwendung des IPC::Shareable-Moduls |
ipc-shareable2.pl |
Liest das Shared-Memory-Segment wieder aus |
apache-mmap-demo.pl |
Zeigt lokale IPC mit Apache::Mmap |
apache-mmap-reader.pl |
Liest aus einer mmap()ten Datei |
ux-client.pl |
Ein einfacher UNIX-Domain-Socket-Client |
ux-server.pl |
Ein einfacher UNIX-Domain-Socket-Server |
ux-dgram-server.pl |
Einfacher UNIX-Domain-Socket-Server. Dgram |
udp-client.pl |
UDP-Client fragt Zeit diverser Hosts ab |
udp-server.pl |
Ein einfacher Tagline-Server, UDP-basiert |
udp-tagclient.pl |
UDP-Client fragt nach einer Tagline |
tcp-client.pl |
Ein einfacher TCP-Client |
tcp-mtclient.pl |
Ein multithreaded interaktiver TCP-Client |
tcp-selectclient.pl |
Ein single-threaded interaktiver TCP-Client |
tcp-server-st.pl |
Ein Single-threaded-TCP-Server |
tcp-server-mt-zombies.pl |
Ein Multithreaded-TCP-Server, Zombies. |
tcp-server-mt.pl |
Ein Multithreaded-TCP-Server |
tcp-server-ioselect.pl |
Ein Single-threaded-TCP-Server mit select() |
net-daemon-demo.pl |
Unser Umdrehserver mit Net::Daemon |
smtp.pl |
Sendet Mails mit Net::SMTP. Ein kleiner Wrapper. |
pop3.pl |
Hole E-Mails mit dem POP3-Protokoll und Net::POP3 |
ftp-client.pl |
Hole eine Liste FTP-URLs von FTP-Servern |
p-Server.pl |
Ein einfacher RPC-Server mit RPC::pServer |
p-Client.pl |
Ein einfacher RPC-Client mit RPC::pClient |
mmap() auf NFS-gemounteten Dateien!mmap()-Systemaufruf, wenn die entsprechende Datei per NFS angesprochen wird! Es ist davon auszugehen, daß ein NFS-Client nicht ohne weiteres per mmap() auf die entfernte Datei zugreifen kann. Was sagt eigentlich POSIX dazu? (1999/12/15, nach einem Hinweis von Joachim Backes).ping.pl zeigt diverse Techniken, um eine Menge von Hosts zu überprüfen. Es verwendet sowohl das Modul Net::Ping als auch ein eventuell vorhandenes externes Programm, das bei den meisten Betriebssystemen ping genannt wird. (1999/11/24, nach einer Frage von Andreas Wahlert)ux-client.pl erzeugt kein Unix-Domain-Socket im Filesystem.ux-client.pl mittels IO::Socket::UNIX ein Client-Socket erzeugt. Das ist aber falsch! Vielmehr wird eine Verbindung zu einem existierenden Unix-Socket aufgebaut, welcher wiederrum vorher von ux-server.pl erzeugt werden muß. Existiert noch kein Unix-Socket, kehrt der Konstruktor IO::Socket::UNIX mit einem falschen Wert zurück. Als Fehlermeldung gibt dann die() aus:
farid@sun-1:~/p> ./ux-client.pl can't connect to Unix Socket: No such file or directory
In Vorbereitung
fork() und exec() anbietet, können Sie folgendes Gerüst verwenden: n-progs.pl.[Alte Quelle]
| Last modified: $Date: 2006/05/18 12:55:44 $ FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy |
|