blob: 17a27b937b79ad73ddbcda1c2390c6bf31244fac [file] [log] [blame]
<html lang="en">
<head>
<title>Testing File Type - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="File-Attributes.html#File-Attributes" title="File Attributes">
<link rel="prev" href="Reading-Attributes.html#Reading-Attributes" title="Reading Attributes">
<link rel="next" href="File-Owner.html#File-Owner" title="File Owner">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Testing-File-Type"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="File-Owner.html#File-Owner">File Owner</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Reading-Attributes.html#Reading-Attributes">Reading Attributes</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="File-Attributes.html#File-Attributes">File Attributes</a>
<hr>
</div>
<h4 class="subsection">14.9.3 Testing the Type of a File</h4>
<p>The <dfn>file mode</dfn>, stored in the <code>st_mode</code> field of the file
attributes, contains two kinds of information: the file type code, and
the access permission bits. This section discusses only the type code,
which you can use to tell whether the file is a directory, socket,
symbolic link, and so on. For details about access permissions see
<a href="Permission-Bits.html#Permission-Bits">Permission Bits</a>.
<p>There are two ways you can access the file type information in a file
mode. Firstly, for each file type there is a <dfn>predicate macro</dfn>
which examines a given file mode and returns whether it is of that type
or not. Secondly, you can mask out the rest of the file mode to leave
just the file type code, and compare this against constants for each of
the supported file types.
<p>All of the symbols listed in this section are defined in the header file
<samp><span class="file">sys/stat.h</span></samp>.
<a name="index-sys_002fstat_002eh-1511"></a>
The following predicate macros test the type of a file, given the value
<var>m</var> which is the <code>st_mode</code> field returned by <code>stat</code> on
that file:
<!-- sys/stat.h -->
<!-- POSIX -->
<div class="defun">
&mdash; Macro: int <b>S_ISDIR</b> (<var>mode_t m</var>)<var><a name="index-S_005fISDIR-1512"></a></var><br>
<blockquote><p>This macro returns non-zero if the file is a directory.
</p></blockquote></div>
<!-- sys/stat.h -->
<!-- POSIX -->
<div class="defun">
&mdash; Macro: int <b>S_ISCHR</b> (<var>mode_t m</var>)<var><a name="index-S_005fISCHR-1513"></a></var><br>
<blockquote><p>This macro returns non-zero if the file is a character special file (a
device like a terminal).
</p></blockquote></div>
<!-- sys/stat.h -->
<!-- POSIX -->
<div class="defun">
&mdash; Macro: int <b>S_ISBLK</b> (<var>mode_t m</var>)<var><a name="index-S_005fISBLK-1514"></a></var><br>
<blockquote><p>This macro returns non-zero if the file is a block special file (a device
like a disk).
</p></blockquote></div>
<!-- sys/stat.h -->
<!-- POSIX -->
<div class="defun">
&mdash; Macro: int <b>S_ISREG</b> (<var>mode_t m</var>)<var><a name="index-S_005fISREG-1515"></a></var><br>
<blockquote><p>This macro returns non-zero if the file is a regular file.
</p></blockquote></div>
<!-- sys/stat.h -->
<!-- POSIX -->
<div class="defun">
&mdash; Macro: int <b>S_ISFIFO</b> (<var>mode_t m</var>)<var><a name="index-S_005fISFIFO-1516"></a></var><br>
<blockquote><p>This macro returns non-zero if the file is a FIFO special file, or a
pipe. See <a href="Pipes-and-FIFOs.html#Pipes-and-FIFOs">Pipes and FIFOs</a>.
</p></blockquote></div>
<!-- sys/stat.h -->
<!-- GNU -->
<div class="defun">
&mdash; Macro: int <b>S_ISLNK</b> (<var>mode_t m</var>)<var><a name="index-S_005fISLNK-1517"></a></var><br>
<blockquote><p>This macro returns non-zero if the file is a symbolic link.
See <a href="Symbolic-Links.html#Symbolic-Links">Symbolic Links</a>.
</p></blockquote></div>
<!-- sys/stat.h -->
<!-- GNU -->
<div class="defun">
&mdash; Macro: int <b>S_ISSOCK</b> (<var>mode_t m</var>)<var><a name="index-S_005fISSOCK-1518"></a></var><br>
<blockquote><p>This macro returns non-zero if the file is a socket. See <a href="Sockets.html#Sockets">Sockets</a>.
</p></blockquote></div>
<p>An alternate non-POSIX method of testing the file type is supported for
compatibility with BSD. The mode can be bitwise AND-ed with
<code>S_IFMT</code> to extract the file type code, and compared to the
appropriate constant. For example,
<pre class="smallexample"> S_ISCHR (<var>mode</var>)
</pre>
<p class="noindent">is equivalent to:
<pre class="smallexample"> ((<var>mode</var> &amp; S_IFMT) == S_IFCHR)
</pre>
<!-- sys/stat.h -->
<!-- BSD -->
<div class="defun">
&mdash; Macro: int <b>S_IFMT</b><var><a name="index-S_005fIFMT-1519"></a></var><br>
<blockquote><p>This is a bit mask used to extract the file type code from a mode value.
</p></blockquote></div>
<p>These are the symbolic names for the different file type codes:
<dl>
<!-- sys/stat.h -->
<!-- BSD -->
<dt><code>S_IFDIR</code><dd><a name="index-S_005fIFDIR-1520"></a>This is the file type constant of a directory file.
<!-- sys/stat.h -->
<!-- BSD -->
<br><dt><code>S_IFCHR</code><dd><a name="index-S_005fIFCHR-1521"></a>This is the file type constant of a character-oriented device file.
<!-- sys/stat.h -->
<!-- BSD -->
<br><dt><code>S_IFBLK</code><dd><a name="index-S_005fIFBLK-1522"></a>This is the file type constant of a block-oriented device file.
<!-- sys/stat.h -->
<!-- BSD -->
<br><dt><code>S_IFREG</code><dd><a name="index-S_005fIFREG-1523"></a>This is the file type constant of a regular file.
<!-- sys/stat.h -->
<!-- BSD -->
<br><dt><code>S_IFLNK</code><dd><a name="index-S_005fIFLNK-1524"></a>This is the file type constant of a symbolic link.
<!-- sys/stat.h -->
<!-- BSD -->
<br><dt><code>S_IFSOCK</code><dd><a name="index-S_005fIFSOCK-1525"></a>This is the file type constant of a socket.
<!-- sys/stat.h -->
<!-- BSD -->
<br><dt><code>S_IFIFO</code><dd><a name="index-S_005fIFIFO-1526"></a>This is the file type constant of a FIFO or pipe.
</dl>
<p>The POSIX.1b standard introduced a few more objects which possibly can
be implemented as object in the filesystem. These are message queues,
semaphores, and shared memory objects. To allow differentiating these
objects from other files the POSIX standard introduces three new test
macros. But unlike the other macros it does not take the value of the
<code>st_mode</code> field as the parameter. Instead they expect a pointer to
the whole <code>struct stat</code> structure.
<!-- sys/stat.h -->
<!-- POSIX -->
<div class="defun">
&mdash; Macro: int <b>S_TYPEISMQ</b> (<var>struct stat *s</var>)<var><a name="index-S_005fTYPEISMQ-1527"></a></var><br>
<blockquote><p>If the system implement POSIX message queues as distinct objects and the
file is a message queue object, this macro returns a non-zero value.
In all other cases the result is zero.
</p></blockquote></div>
<!-- sys/stat.h -->
<!-- POSIX -->
<div class="defun">
&mdash; Macro: int <b>S_TYPEISSEM</b> (<var>struct stat *s</var>)<var><a name="index-S_005fTYPEISSEM-1528"></a></var><br>
<blockquote><p>If the system implement POSIX semaphores as distinct objects and the
file is a semaphore object, this macro returns a non-zero value.
In all other cases the result is zero.
</p></blockquote></div>
<!-- sys/stat.h -->
<!-- POSIX -->
<div class="defun">
&mdash; Macro: int <b>S_TYPEISSHM</b> (<var>struct stat *s</var>)<var><a name="index-S_005fTYPEISSHM-1529"></a></var><br>
<blockquote><p>If the system implement POSIX shared memory objects as distinct objects
and the file is an shared memory object, this macro returns a non-zero
value. In all other cases the result is zero.
</p></blockquote></div>
</body></html>