Chapter Contents |
Previous |
Next |
fcntl |
Portability: | POSIX.1 conforming, UNIX compatible |
SYNOPSIS | |
DESCRIPTION | |
RETURN VALUE | |
PORTABILITY | |
EXAMPLES | |
SEE ALSO |
SYNOPSIS |
#include <sys/types.h> #include <fcntl.h> int fcntl(int filedes, int action, argument);
DESCRIPTION |
fcntl
controls open USS file descriptors and sockets.
filedes
is the file descriptor.
action
is the action to be performed on the file or socket. For a nonintegrated
socket, the only actions that can be specified are
F_GETFL
and
F_SETFL
. The third argument
required by some actions is
argument
. The
type of this argument depends on the action.
You can specify
the following actions with
fcntl
:
F_DUPFD
|
duplicates the file descriptor and
returns the lowest available file descriptor greater than or equal to
argument
. This duplicate file descriptor refers
to the same file as
filedes
. |
F_DUPFD2
|
duplicates the file descriptor and
returns a file descriptor specified by
argument
. The file descriptor specified by
argument
is closed and is then used as the new file descriptor. This duplicate
file descriptor refers to the same file as
filedes
. |
F_GETFD
|
returns the file descriptor flags
for
filedes
. This action has no effect
if
filedes
is a non-integrated socket. |
F_SETFD
|
sets the file descriptor flags for
filedes
. New flag settings are specified by
argument
. This action has no effect if
filedes
is a nonintegrated
socket. |
F_GETFL
|
returns the file-status flags and
file access mode flags for
filedes
. If
filedes
is a nonintegrated socket, only the setting
of
O_NONBLOCK
is significant. |
F_SETFL
|
Sets the flag status flags for
filedes
. New flag settings are specified by
argument
.
fcntl
does not change the file access mode. If
filedes
is a nonintegrated socket, only the
O_NONBLOCK
setting may be
changed. |
F_GETLK
|
returns locking information for a file. |
F_SETLK
|
sets or clears a file segment lock. |
F_SETLKW
|
sets or clears a file segment lock.
If a lock is blocked by other locks,
fcntl
waits until it can set or clear the lock. |
F_CLOSFD
|
closes a range of file descriptors.
argument
specifies the upper limit of
the range.
filedes
is the lower limit.
If
argument
is a -1, all file descriptors
greater than or equal to
fildes
are closed. |
The following flags and masks are defined in
<fcntl.h>
:
RETURN VALUE |
fcntl
returns the value specified by
action
.
The
fcntl
function returns a -1 if
it is not successful.
PORTABILITY |
The
F_CLOSFD
action and the
FD_CLOFORK
flag
are extensions defined by IBM to the POSIX.1 standard.
EXAMPLES |
This example updates a counter stored
in the first four bytes of an HFS file. It uses the record-locking feature
of
fcntl
to ensure that two processes running
the same program do not update the file simultaneously.
/* This example requires cxompilation with the posix option. */ #include <sys/types.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> main() { int fd; long count; struct flock lock; int rc; /* If the file does not yet exist, create it, and treat the */ /* counter as 0. If the file does exist, do not truncate */ /* it, as we need the old data. */ fd = open("/u/yvonne/counter", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); if (fd < 0) { perror("open error"); exit(EXIT_FAILURE); } lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET; lock.l_start = 0L; lock.l_len = sizeof(count); rc = fcntl(fd, F_SETLKW, &lock); /* Lock bytes 0-3. */ if (rc == -1) { perror("fcntl F_WRLCK error"); exit(EXIT_FAILURE); } rc = read(fd, &count, sizeof(count)); if (rc == -1) { perror("read"); exit(EXIT_FAILURE); } if (rc < sizeof(count)) count = 0; /* If too few bytes read, assume count 0. */ rc = lseek(fd, 0L, SEEK_SET); if (rc != 0) { perror("lseek error"); exit(EXIT_FAILURE); } ++count; rc = write(fd, &count, sizeof(count)); if (rc != sizeof(count)) { perror("write error"); exit(EXIT_FAILURE); } /* The lock will be released when the file is closed, */ /* but to be polite we will release it explicitly. */ lock.l_type = F_UNLCK; rc = fcntl(fd, F_SETLK, &lock); /* Unlock bytes 0-3. */ if (rc == -1) { perror("fcntl F_UNLCK error"); exit(EXIT_FAILURE); } fclose(fd); exit(EXIT_SUCCESS); }
SEE ALSO |
Chapter Contents |
Previous |
Next |
Top of Page |
Copyright © 2001 by SAS Institute Inc., Cary, NC, USA. All rights reserved.