mktemp(3)mktemp(3)NAME
mktemp, mkstemp, mkstemps, mkdtemp - Construct a unique file name or
directory
SYNOPSIS
#include <stdlib.h>
char *mktemp(
char *template ); int mkstemp(
char *template ); int mkstemps(
char *template,
int suffixlen ); char *mkdtemp(
char *template );
LIBRARY
Standard C Library (libc)
System V Compatibility Library (libsys5)
STANDARDS
Interfaces documented on this reference page conform to industry stan‐
dards as follows:
mktemp(), mkstemp(): XSH4.2, XSH5.0
Refer to the standards(5) reference page for more information about
industry standards and associated tags.
PARAMETERS
Points to a string to be modified to form a unique file name. The
string should be composed of characters from the portable character
set. Elements in the string consist of an optional prefix, 6 or more X
characters (which are replaced to make the file name unique), and -- in
the case of the mkstemps() function -- a suffix. The template string
prior to the suffix element should look like a file name with six or
more trailing X characters. The string has the following forms: For
mktemp(), mkstemp(), and mkdtemp() functions:
[prefix]XXXXXXX For the mkstemps() function:
[prefix]XXXXXXsuffix
The prefix portion of the template string (often a directory
specification and/or file name prefix) is optional, the string
of 6 or more Xs is replaced when the file name is generated, and
the suffix portion is the string to be appended when generating
the file name. The template string prior to suffix should look
like a file name with six or more trailing X characters. The
length of the suffix in the template string.
DESCRIPTION
The mktemp() function replaces, with a unique file name, the contents
of the template string pointed to by the template parameter. The appli‐
cation should initialize the template string to be a file name with six
or more trailing X characters. To generate a unique file name, mktemp()
replaces the Xs in the template string with characters from the porta‐
ble character set. Note that a possible race condition can exist when
using the mktemp() function. The mkstemp(), mkstemps(), and mkdtemp()
functions avoid this problem; see APPLICATION USAGE for details.
For compatibility with SVID2, the libsys5 version of mktemp() uses the
getpid() function when generating the file name. In addition to suffer‐
ing from the same race condition mentioned above, the required use of
getpid() by the libsys5 version of mktemp() results in significantly
more predictable file name generation, and this predictability could be
misused by a hostile process. To avoid these problems, use the
mkstemp(), mkstemps(), or mkdtemp() functions (not specified by SVID2).
The mkstemp() function performs the same substitution to the template
name as mktemp(), but it also creates the file with mode 0600 and
returns, for the file, a file descriptor that is open for reading and
writing. The function thus prevents any possible race condition that
could exist in the interval between testing whether the file exists and
opening it for use.
The mkstemps() function is similar to the mkstemp() function, except
that it permits the inclusion of a trailing suffix in the template
string. The suffix is appended to the generated file name.
The mkdtemp() function is similar to the mkstemp() function, except
that it creates a mode 0700 directory instead of a file name and
returns a pointer to a string containing the resulting directory path
that has been created.
The mkdtemp() and mkstemps() functions first appeared in OpenBSD.
RETURN VALUES
Upon successful completion, the mktemp() function returns the address
of the string pointed to by the template parameter. If the string
pointed to by the template parameter does not contain trailing Xs or if
the mktemp() function is unable to construct a unique file name, the
first character of the template string is replaced with a null charac‐
ter and a null pointer is returned.
Upon successful completion, the mkstemp() function returns an open file
descriptor. If the string pointed to by the template parameter does not
contain trailing Xs or if no suitable file can be created, -1 is
returned.
Upon successful completion, the mkstemps() function returns an open
file descriptor. Under any of the following conditions, -1 is returned
and errno is set to indicate the error: If the string pointed to by the
template parameter does not contain trailing Xs prior to the start of
the suffix If the suffix contains a slash (/) If suffixlen is larger
than the length of the template If no suitable file can be created
Upon successful completion, the mkdtemp() function returns the address
of the string pointed to by the template parameter. If the string
pointed to by the template parameter does not contain trailing Xs or if
no suitable directory can be created, a null pointer is returned and
errno is set to indicate the error.
ERRORS
No errors are defined for the mktemp() or mkstemp() functions.
The mkstemps() function may set errno to one of the following values or
to any value specified by the open() or stat() function: The string
pointed to by the template parameter does not contain trailing Xs prior
to the start of the suffix, the suffix contains a slash (/), or suf‐
fixlen is larger than the length of the template. The pathname portion
of the template is not an existing directory.
The mkdtemp() function may set errno to one of the following values or
to any value specified by the stat() and mkdir() functions: The string
pointed to by the template parameter does not contain trailing Xs. The
pathname portion of the template is not an existing directory.
APPLICATION USAGE
The use of mktemp() is discouraged due to a race condition that may
exist between the time a file name is created and the time the file is
opened. During this interval, it is possible for some other (poten‐
tially hostile) process to create a file with the same name. The
mkstemp(), mkstemps(), and mkdtemp() functions avoid this problem by
creating the file name or directory in a way that ensures that duplica‐
tion cannot occur.
It is important that the template parameter passed to these functions
does not point to a read-only string. For example, a call such as:
int retval; retval = mkstemp("/tmp/temp.XXXXXX");
may result in a core dump when the mkstemp() function attempts to mod‐
ify a string constant.
EXAMPLES
The following example uses mkstemp() to create and open a temp file:
#include <string.h> #include <stdlib.h> #include <unistd.h> #include
<stdio.h> main() {
char template[16];
int fd = -1;
strcpy(template, "/tmp/tempXXXXXX");
if ((fd = mkstemp(template)) != -1) {
/* use 'fd' here */
unlink(template);
close(fd);
} else
fprintf(stderr, "Failed to create temp file.\n"); }
The following example uses mkstemps() to create and open a temp file
with a suffix:
#include <string.h> #include <stdlib.h> #include <unistd.h> #include
<stdio.h> #include <errno.h> main() {
char template[20];
int fd = -1;
strcpy(template, "/tmp/tempXXXXXXX.xyz");
if ((fd = mkstemps(template, 4)) != -1) {
/* use 'fd' here */
unlink(template);
close(fd);
} else
fprintf(stderr, "Failed to create temp file.\n%s\n",
strerror(errno)); }
The following example uses mkdtemp() to create a temp directory and, if
successful, then uses mkstemp() to create a temp file within the direc‐
tory:
#include <string.h> #include <stdlib.h> #include <unistd.h> #include
<stdio.h> #include <errno.h> main() {
char template[35], dirpath[22], *dp;
int fd = -1;
strcpy(dirpath, "/tmp/tempdir.XXXXXXXX");
if ((dp = mkdtemp(dirpath)) != NULL) {
/* begin - example use of 'dp' */
sprintf(template, "%s/%s", dp, "tempXXXXXXXX");
if ((fd = mkstemp(template)) != -1) {
/* use 'fd' here */
unlink(template);
close(fd);
} else
fprintf(stderr, "Failed to create temp file.\n%s\n",
strerror(errno));
/* end - example use of 'dp' */
rmdir(dirpath);
} else
fprintf(stderr, "Failed to create temp directory.\n%s\n",
strerror(errno)); }
SEE ALSO
Functions: tmpfile(3), tmpnam(3), mkdir(2), open(2), stat(2)
Standards: standards(5)mktemp(3)