fishnuts has asked for the wisdom of the Perl Monks concerning the following question:
#!/usr/bin/perl use strict; use warnings; $|++; use Fcntl qw(:DEFAULT O_ASYNC O_DIRECT); use Sys::Mmap; my $FH; my $msg; my $BUFFER=""; my $ret; my $seekpos=2; my $BUFSIZE = 4096 ; my $soffset; sysopen($FH, "/tmp/test.dat", O_RDWR | O_ASYNC | O_DIRECT | O_CREAT, 0 +666) or die "$!"; substr($BUFFER, 0, $BUFSIZE) = "\0"x$BUFSIZE; $soffset = $BUFSIZE * $seekpos; print "seeking to $soffset\n"; $ret = sysseek($FH, $soffset, 0) or print "first sysseek FAILED: $!\n" +; print "first sysseek succeeded. returned $ret\n"; $msg="data at $soffset"; substr($BUFFER, 0, length($msg))=$msg; $ret = syswrite($FH, $BUFFER, $BUFSIZE) or print "first syswrite FAILE +D: $!\n"; print "first syswrite succeeded. returned $ret\n" if defined $ret; print "\n"; print "mmap coming up...\n"; $ret=mmap($BUFFER, $BUFSIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANO +N, STDOUT) or die "Couldn't mmap: $!\n"; printf "mmap succeeded. returned address %x\n", $ret if defined $ret; if (($ret % 4096) == 0) { print "coolness... $ret is aligned to 4096 byte boundary\n"; } print "\n"; print "seeking to $soffset\n"; $ret = sysseek($FH, $soffset, 0) or print "second sysseek FAILED: $!\n +"; print "second sysseek succeeded. returned $ret\n" if defined $ret; $msg="data at $soffset"; substr($BUFFER, 0, length($msg))=$msg; $ret = syswrite($FH, $BUFFER, $BUFSIZE) or print "second syswrite FAIL +ED: $!\n"; print "second syswrite succeeded. returned $ret\n" if defined $ret; print "\n"; print "seeking to $soffset\n"; $ret = sysseek($FH, $soffset, 0) or print "third sysseek FAILED: $!\n" +; print "third sysseek succeeded. returned $ret\n" if defined $ret; $ret = sysread($FH, $BUFFER, $BUFSIZE) or print "sysread FAILED: $!\n" +; print "sysread succeeded. returned $ret\n" if defined $ret; exit 0;
|
|---|