FILE(9) OpenBSD Kernel Manual FILE(9)NAME
file - an overview of file descriptor handling
SYNOPSIS
#include <sys/file.h>
#include <sys/filedesc.h>
int
falloc(struct proc *p, struct file **resultfp, int *resultfd);
int
fdrelease(struct proc *p, int fd);
void
FREF(struct file *fp);
void
FRELE(struct file *fp);
struct file *
fd_getfile(struct filedesc *fdp, int fd);
int
getsock(struct filedesc *fdp, int fd, struct file **fpp);
#include <sys/file.h>
#include <sys/filedesc.h>
#include <sys/vnode.h>
int
getvnode(struct filedesc *fdp, int fd, struct file **fpp);
DESCRIPTION
These functions provide the interface for the UNIX file descriptors.
File descriptors can be used to access vnodes (see vnode(9)), sockets
(see socket(2)), pipes (see pipe(2)), kqueues (see kqueue(2)), and
various special purpose communication endpoints.
A new file descriptor is allocated with the function falloc() and freed
with fdrelease(). falloc() and fdrelease() deal with allocating and
freeing slots in the file descriptor table, expanding the table when
necessary and initializing the descriptor. It's possible to do those
things in smaller steps, but it's not recommended to make complicated
kernel APIs that require it.
The files are extracted from the file descriptor table using the
functions fd_getfile(), getvnode() and getsock(). fd_getfile() performs
all necessary checks to see if the file descriptor number is within the
range of file descriptor table, and if the descriptor is valid.
getsock() and getvnode() are special cases that besides doing
fd_getfile() also check if the descriptor is a vnode or socket, return
the proper errno on error and increase the use count with FREF().
CONCURRENT ACCESS
Since multiple processes can share the same file descriptor table, it's
important that the file is not freed in one process while some other
process is still accessing it. To solve that problem a special use count
is kept with the functions FREF() and FRELE(). In most cases FREF()
should be used on a file after it has been extracted from the file
descriptor table and FRELE() should be called when the file won't be used
anymore. There are cases when this isn't necessary, but since FREF() and
FRELE() are cheap to use, there is no reason to risk introducing bugs by
not using them.
CODE REFERENCES
The majority of those functions are implemented in
sys/kern/kern_descrip.c. The function prototypes and the macros are
located in sys/sys/file.h and sys/sys/filedesc.h.
SEE ALSOvnode(9)OpenBSD 4.9 May 31, 2007 OpenBSD 4.9