NAME
POSIX::1003::FdIO - POSIX handling file descriptors
SYNOPSIS
use POSIX::1003::FdIO;
$fd = openfd($fn, O_RDWR);
defined $fd or die $!; # $fd==0 is valid value! (STDIN)
$fd = openfd($fn, O_WRONLY|O_TRUNC);
$fd = openfd($fn, O_CREAT|O_WRONLY, 0640);
my $buf;
$bytes_read = readfd($fd, $buf, BUFSIZ);
$bytes_written = writefd($fd, $buf, 5);
$off_t = seekfd($fd, 0, SEEK_SET); # rewind!
$fd2 = dupfd($fd);
closefd($fd) or die $!;
my ($r, $w) = pipefd();
writefd($w, "hello", 5);
readfd($r, $buf, 5);
closefd($r) && closefd($w) or die $!;
my $fh = fdopen($fd, 'w') or die $!;
DESCRIPTION
Most people believe that the sys*
commands in Perl Core are not capable of doing unbuffered IO. For those people, we have this module. But there is more in file-descriptor space, missing from Core.
The question whether sysread()
or readfd() is meassurable faster cannot be answered.
The fcntl()
command has its separate module POSIX::1003::Fcntl. Locking functions are locate there as well, because they are often implemented via fcntl
.
FUNCTIONS
Overview
Perl defaults to use file-handles, avoiding file descriptors. For that reason, the fread
of POSIX is the read
of Perl; that's confusing. But the POSIX standard is confused as well: some function names which start with an f
are actually for file-descriptors, other for file-handles!
The POSIX module, distributed with Perl, makes you write CORE::read()
and POSIX::read()
explicitly. However, POSIX::read()
is the same as CORE::sysread()
!
To avoid conflicts with function names in Perl core, and the confusion that the POSIX created, all exported function names provided by this module contain 'fd' in their name.
POSIX Perl-Core POSIX.pm POSIX::1003::FdIO
FH fseek seek
FD lseek sysseek lseek seekfd
FH fopen open
FD open sysopen openfd # sysopen is clumpsy
FD fdopen open fdopen # IO::Handle->new_from_fd
FH fclose close
FD close close close closefd
FH fread read
FD read sysread read readfd
FH fwrite print
FD write syswrite write writefd
FH pipe,open # buffered unless $|=0
FD pipe pipe pipefd
FH stat stat
FD fstat fstat statfd
FN lstat lstat
FH ftell tell
FD tellfd # tell on fd not in POSIX
FH rewind rewind
FD rewindfd # rewind on fd not in POSIX
FD creat creat creatfd
FD dup dupfd
FD fcntl fcntl (many) # see ::Fcntl
FD flock flock flockfd # see ::Fcntl
FD lockf lockf # see ::Fcntl
FN truncate truncate
FD ftruncate truncfd
Works on: FH=file handle, FD=file descriptor, FN=file name
Standard POSIX
- closefd($fd)
-
Always check the return code:
undef
on error, cause in$!
. closefd $fd or die $!;There is no
sysclose()
in core, becausesysopen()
does unbuffered IO via its perl-style file-handle: when you open withCORE::sysopen()
, you must close withCORE::close()
. - creatfd($filename, $mode)
-
Implemented via openfd(), which is true by definition of POSIX.
- dup2fd($fd, $newfd)
-
Copy file-descriptor $fd to an explicit $newfd number. When already in use, the file at $newfd will be closed first. Returns undef on failure.
- dupfd($fd)
-
Copy the file-descriptor $fd into the lowest-numbered unused descriptor. The new fd is returned, undef on failure.
- fdopen($fd, $mode)
-
Converts a $fd into an (buffered) FH. You probably want to set binmode after this. $mode can be Perl-like '<', '>', '>>', or POSIX standard 'r', 'w', 'a'. POSIX modes 'r+', 'w+', and 'a+' can probably not be supported.
- openfd($filename, $flags, $mode)
-
Returned is an integer file descriptor (FD). Returns
undef
on failure (and '0' is a valid FD!)$flags are composed from the
O_*
constants defined by this module (import tag:mode
) The $mode field combinesS_I*
constants defined by POSIX::1003::FS (import tag:stat
). - pipefd()
-
Returns the reader and writer file descriptors. See also POSIX::1003::Fcntl::setfd_pipe_size()
example:
my ($r, $w) = pipefd; writefd($w, "hello", 5 ); readfd($r, $buf, 5 );
- readfd( $fd, SCALAR, [$length] )
-
Read the maximum of $length bytes from $fd into the SCALAR. Returned is the actual number of bytes read. The value
-1
tells you there is an error, reported in$!
Be warned that a returned value smaller than $length does not mean that the $fd has nothing more to offer: the end is reached only when 0 (zero) is returned. Therefore, this reading is quite inconvenient. You may want to use POSIX::Util subroutine readfd_all
- seekfd($fd, $offset, $whence)
-
The $whence is a
SEEK_*
constant. - statfd($fd)
-
Request file administration information about an open file. It returns the same list of values as
stat
on filenames. - truncfd( $fd, [$length] )
-
[0.96] Shorten the file to the $length (defaults to 0). The file offset (your pointer in the file) is not changed, so you may need to seekfd() as well. Behavior is undefined when $length is larger than the file size.
The POSIX name for this function is
ftruncate
. - writefd( $fd, $bytes, [$length] )
-
Attempt to write the first $length bytes of STRING to $fd. Returned is the number of bytes actually written. You have an error only when
-1
is returned.
Additional
Zillions of Perl programs reimplement these functions. Let's simplify code.
- rewindfd($fd)
-
Seek to the beginning of the file.
- tellfd($fd)
-
Reports the location in the file. This call does not exist (not in POSIX, nor on other UNIXes), however is a logical counterpart of the
tell()
on filenames.
CONSTANTS
The following constants are exported, shown here with the values discovered during installation of this module.
BUFSIZ 8192
EOF -1
MAX_INPUT 255
O_ACCMODE 3
O_APPEND 1024
O_ASYNC 8192
O_CLOEXEC 524288
O_CREAT 64
O_DIRECT 16384
O_DIRECTORY 65536
O_DSYNC 4096
O_EXCL 128
O_FSYNC 1052672
O_LARGEFILE 0
O_NDELAY 2048
O_NOATIME 262144
O_NOCTTY 256
O_NOFOLLOW 131072
O_NONBLOCK 2048
O_RDONLY 0
O_RDWR 2
O_RSYNC 1052672
O_SYNC 1052672
O_TRUNC 512
O_WRONLY 1
PIPE_BUF 4096
SEEK_CUR 1
SEEK_DATA 3
SEEK_END 2
SEEK_HOLE 4
SEEK_SET 0
SSIZE_MAX 9223372036854775807
STDERR_FILENO 2
STDIN_FILENO 0
STDOUT_FILENO 1
You can limit the import to the SEEK_*
constants by explicitly using the :seek
import tag. Use the :mode
for all O_*
constants, to be used with openfd().
SEE ALSO
This module is part of POSIX-1003 distribution version 0.99_01, built on January 31, 2015. Website: http://perl.overmeer.net. The code is based on POSIX, which is released with Perl itself. See also POSIX::Util for additional functionality.
COPYRIGHTS
Copyrights 2011-2015 on the perl code and the related documentation by [Mark Overmeer]. For other contributors see ChangeLog.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See http://www.perl.com/perl/misc/Artistic.html