UNIX标准及实现
UNIX标准化
- ISO C标准定义的头文件
<assert.h>
<complex.h>
<ctype.h>
<errno.h>
<fenv.h>
<float.h>
<intypes.h>
<iso646.h>
<limits.h>
<locale.h>
<math.h>
<setjmp.h>
<signal.h>
<stdarg.h>
<stdbool.h>
<stddef.h>
<stdint.h>
<stdio.h>
<stdlib.h>
<string.h>
<tgmath.h>
<time.h>
<wchar.h>
<wctype.h>
- POSIX标准定义的头文件
ISO C标准定义的头文件
<aio.h>
<cpio.h>
<dirent.h>
<dlfcn.h>
<fcntl.h>
<fnmatch.h>
<glob.h>
<grp.h>
<iconv.h>
<langinfo.h>
<monetary.h>
<netdb.h>
<nl_types.h>
<poll.h>
<pthread.h>
<pwd.h>
<regex.h>
<sched.h>
<semaphore.h>
<strings.h>
<tar.h>
<termios.h>
<unistd.h>
<wordexp.h>
<arpa/inet.h>
<net/if.h>
<netinet/in.h>
<netinet/tcp.h>
<sys/mman.h>
<sys/select.h>
<sys/socket.h>
<sys/stat.h>
<sys/statvfs.h>
<sys/times.h>
<sys/types.h>
<sys/un.h>
<sys/utsname.h>
<sys/wait.h>
// 可选部分
<fmtmsg.h>
<ftw.h>
<libgen.h>
<ndbm.h>
<search.h>
<syslog.h>
<utmpx.h>
<sys/ipc.h>
<sys/msg.h>
<sys/resource.h>
<sys/sem.h>
<sys/shm.h>
<sys/time.h>
<sys/uio.h>
<mqueue.h>
<spawn.h>
选项码 符号常量
ADV _POSIX_ADVISORY_INFO
CPT _POSIX_CPUTIME
FSC _POSIX_FSYNC
IP6 _POSIX_IPV6
ML _POSIX_MEMLOCK
MLR _POSIX_MEMLOCK_RANGE
MON _POSIX_MONOTONIC_CLOCK
MSG _POSIX_MESSAGE_PASSING
MX __STDC_IEC_559__
PIO _POSIX_PRIORITIZED_IO
PS _POSIX_PRIORITIZED_SCHEDULING
RPI _POSIX_THREAD_ROBUST_PRIO_INHERIT
RPP _POSIX_THREAD_ROBUST_PRIO_PROTECT
RS _POSIX_RAW_SOCKETS
SHM _POSIX_SHARED_MEMORY_OBJECTS
SIO _POSIX_SYNCHRONIZED_IO
SPN _POSIX_SPAWN
SS _POSIX_SPORADIC_SERVER
TCT _POSIX_THREAD_CPUTIME
TPI _POSIX_THREAD_PRIO_INHERIT
TPP _POSIX_THREAD_PRIO_PROTECT
TPS _POSIX_THREAD_PRIORITY_SCHEDULING
TSA _POSIX_THREAD_ATTR_STACKADDR
TSH _POSIX_THREAD_PROCESS_SHARED
TSP _POSIX_THREAD_SPORADIC_SERVER
TSS _POSIX_THREAD_ATTR_STACKSIZE
TYM _POSIX_TYPED_MEMORY_OBJECTS
XSI _XOPEN_UNIX
- Single UNIX Specification
UNIX系统实现
- SVR4/4.4BSD/FreeBSD/Linux/Mac OS X/Solaris/AIX/HP-UX/IRIX/UnixWare
限制
- 编译时限制,与文件或目录无关的运行时限制,与文件或目录有关的运行时限制。
- ISO C限制
CHAR_BIT
CHAR_MAX
CHAR_MIN
SCHAR_MAX
SCHAR_MIN
UCHAR_MAX
INT_MAX
INT_MIN
UINT_MAX
SHRT_MAX
SHRT_MIN
USHRT_MAX
LONG_MAX
LONG_MIN
ULONG_MAX
LLONG_MAX
LLONG_MIN
ULLONG_MAX
MB_LEN_MAX
FOPEN_MAX
TMP_MAX
FILENAME_MAX
- POSIX限制
数值限制,如LONG_BIT,SSIZE_MAX,WORD_BIT
最小值
最大值
运行时可增加的值,如CHARCLASS_NAME_MAX,COLL_WEIGHTS_MAX,LINE_MAX,NGROUPS_MAX,RE_DUM_MAX
运行时不变值
其他不变值,如NL__ARGMAX, NL_MSGMAX, NL_SETMAX, NL_TEXTMAX
路径名可变值,如FILESIZEBITS, LINK_MAX, MAX_CANON, MAX_INPUT, NAME_MAX, PATH_MAX, PIPE_BUF, SYMLINK_MAX
_POSIX_ARG_MAX
_POSIX_CHILLD_MAX
_POSIX_DELAYTIMER_MAX
_POSIX_HOST_NAME_MAX
_POSIX_LINK_MAX
_POSIX_LOGIN_NAME_MAX
_POSIX_MAX_CANON
_POSIX_MAX_INPUT
_POSIX_NAME_MAX
_POSIX_NGROUPS_MAX
_POSIX_OPEN_MAX
_POSIX_PATH_MAX
_POSIX_PIPE_BUF
_POSIX_RE_DUP_MAX
_POSIX_RTSIG_MAX
_POSIX_SEM_NSEMS_MAX
_POSIX_SEM_VALUE_MAX
_POSIX_SIGQUEUE_MAX
_POSIX_SSIZE_MAX
_POSIX_STREAM_MAX
_POSIX_SYMLINK_MAX
_POSIX_SYMLOOP_MAX
_POSIX_TIMER_MAX
_POSIX_TTY_NAME_MAX
_POSIX_TZNAME_MAX
// POSIX.1运行时不变值
ARG_MAX
ATEXIT_MAX
CHILD_MAX
DELAYTIMER_MAX
HOST_NAME_MAX
LOGIN_NAME_MAX
OPEN_MAX
PAGESIZE
RTSIG_MAX
SEM_NSEMS_MAX
SEM_VALUE_MAX
SIGQUEUE_MAX
STREAM_MAX
SYMLOOP_MAX
TIMER_MAX
TTY_NAME_MAX
TZNAME_MAX
- XSI限制
最小值
运行时不变值
NL_LANGMAX
NZERO
_XOPEN_IOV_MAX
_XOPEN_NAME_MAX
_XOPEN_PATH_MAX
- sysconf, pathconf, fpathconf
#include <unistd.h>
// 如name不是合适常量,返回-1,errno置为EINVAL。返回值是不确定值时,返回-1,但不改变errno。
// _SC_运行时限制
// _SC_ARG_MAX
// _SC_ATEXIT_MAX
// _SC_CHILD_MAX
// _SC_CLK_TCK
// _SC_COLL_WEIGHTS_MAX
// _SC_DELAYTIMER_MAX
// _SC_HOST_NAME_MAX
// _SC_IOV_MAX
// _SC_LINE_MAX
// _SC_LOGIN_NAME_MAX
// _SC_NGROUPS_MAX
// _SC_OPEN_MAX
// _SC_PAGE_SIZE
// _SC_PAGESIZE
// _SC_RE_DUP_MAX
// _SC_RTSIG_MAX
// _SC_SEM_NSEMS_MAX
// _SC_SEM_VALUE_MAX
// _SC_SIGQUEUE_MAX
// _SC_STREAM_MAX
// _SC_SYMLOOP_MAX
// _SC_TIMER_MAX
// _SC_TTY_NAME_MAX
// _SC_TZNAME_MAX
long sysconf(int name);
// _PC_FILESIZEBITS pathname/fd引用的文件可以需要是目录,返回值用于目录中文件名
// _PC_LINK_MAX pathname/fd引用的文件可以是文件或目录,如果是目录,返回值用于目录自身
// _PC_MAX_CANON pathname/fd引用的文件需要是终端文件
// _PC_MAX_INPUT pathname/fd引用的文件需要是终端文件
// _PC_NAME_MAX pathname/fd引用的文件可以需要是目录,返回值用于目录中文件名
// _PC_PATH_MAX pathname/fd引用的文件可以需要是目录,指定的目录是工作目录时,返回值是相对路径名的最大长度
// _PC_PIPE_BUF pathname/fd引用的文件可以需要是管道、FIFO或目录,指定的目录是管道或FIFO时,返回值是对所引用管道或FIFO的限制值。对目录,返回值是对该目录下创建的任一FIFO的限制值
// _PC_TIMESTAMP_RESOLUTION pathname/fd引用的文件可以是文件或目录,如果是目录,返回值用于目录自身
// _PC_SYMLINK_MAX pathname/fd引用的文件可以需要是目录,返回值是该目录下符号链接可包含字符串的最大长度
long pathconf(const char* pathname, int name);
long fpathconf(int fd, int name);
个别情况下,动态查询结果可能有误。
6. 不确定的运行时限制
路径名
最大打开文件数
选项
POSIX.1定义了三种处理选项方法
- 编译时选项定义在<unistd.h>
- 与文件或目录无关的运行时选项用sysconf判断
- 与文件或目录有关的运行时选项用pathconf, fpathconf来判断
对于每一个选项,有以下三种可能的平台支持状态 - 符号常量没定义或定义为-1.该平台编译时不支持相应选项。
- 符号常量定义值大于0,则该平台支持相应选项。
- 如符号常量定义值为0,需要用sysconf, pathconf, fpathconf来判断选项是否被支持。
先用_POSIX_X查询选项 _POSIX_X为0时,用动态查询
_POSIX_CHOWN_RESTRICTED _PC_CHOWN_RESTRICTED 引用的文件需要为文件或目录,如为目录,指明选项是否可应用于目录下各个文件
_POSIX_NO_TRUNC _PC_NO_TRUNC 引用的文件需要为目录,返回值可用于目录中各个文件
_POSIX_VDISABLE _PC_VDISABLE 引用的文件需要是终端文件
_POSIX_ASYNC_IO _PC_ASYNC_IO 引用的文件不能是目录
_POSIX_PRIO_IO _PC_PRIO_IO 引用的文件不能是目录
_POSIX_SYNC_IO _PC_SYNC_IO 引用的文件不能是目录
_POSIX2_SYMLINKS _PC_2_SYMLINKS 引用的文件需要为目录
_POSIX_ASYNCHRONOUS_IO _SC_ASYNCHRONOUS_IO
_POSIX_BARRIERS _SC_BARRIERS
_POSIX_CLOCK_SELECTION _SC_CLOCK_SELECTION
_POSIX_JOB_CONTROL _SC_JOB_CONTROL
_POSIX_MAPPED_FILES _SC_MAPPED_FILES
_POSIX_MEMORY_PROTECTION _SC_MEMORY_PROTECTION
_POSIX_READER_WRITER_LOCKS _SC_READER_WRITER_LOCKS
_POSIX_REALTIME_SIGNALS _SC_REALTIME_SIGNALS
_POSIX_SAVED_IDS _SC_SAVED_IDS
_POSIX_SEMAPHORES _SC_SEMAPHORES
_POSIX_SHELL _SC_SHELL
_POSIX_SPIN_LOCKS _SC_SPIN_LOCKS
_POSIX_THREAD_SAFE_FUNCTIONS _SC_THREAD_SAFE_FUNCTIONS
_POSIX_THREADS _SC_THREADS
_POSIX_TIMEOUTS _SC_TIMEOUTS
_POSIX_TIMERS _SC_TIMERS
_POSIX_VERSION _SC_VERSION 标准发布年份,月份
_XOPEN_CRYPT _SC_XOPEN_CRYPT
_XOPEN_REALTIME _SC_XOPEN_REALTIME
_XOPEN_REALTIME_THREADS _SC_XOPEN_REALTIME_THREADS
_XOPEN_SHM _SC_XOPEN_SHM
_XOPEN_VERSION _SC_XOPEN_VERSION 系统支持的XSI版本
功能测试宏
// 功能测试宏,如_POSIX_C_SOURCE, _XOPEN_SOURCE
// 通常使用
linux>cc -D_POSIX_C_SOURCE=200809L file.c
// 或者源文件第一行设置为 #define _POSIX_C_SOURCE 200809L
// 或者
linux>gcc -D_XOPEN_SOURCE=700 file.c -o file
基本系统数据类型
clock_t
comp_t
dev_t
fd_set
fpos_t
gid_t
ino_t
mode_t
nlink_t
off_t
pid_t
pthread_t
ptrdiff_t
rlim_t
sig_atomic_t
sigset_t
size_t
ssize_t
time_t
uid_t
wchar_t
标准间冲突
一般ISO C和POSIX.1冲突时,服从ISO C
某些差别,
ISO C和POSIX.1用同一种数据类型(clock_t)保存对时间的测量,但定义了不同的单位。