久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UNIX标准及实现

發(fā)布時間:2025/7/14 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UNIX标准及实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

UNIX標(biāo)準(zhǔn)及實(shí)現(xiàn)

引言

? ? 在UNIX編程環(huán)境和C程序設(shè)計(jì)語言的標(biāo)準(zhǔn)化方面已經(jīng)做了很多工作。雖然UNIX應(yīng)用程序在不同的UNIX操作系統(tǒng)版本之間進(jìn)行移植相當(dāng)容易,但是20世紀(jì)80年代UNIX版本的劇增以及它們之間差別的擴(kuò)大,導(dǎo)致很多大用戶(例如美國政府)呼吁對其進(jìn)行標(biāo)堆化。 ? ? 本章首先將介紹過去20年來進(jìn)行的各種標(biāo)準(zhǔn)化工作,然后討論這些UNIX編程標(biāo)準(zhǔn)對本書所列舉的各種UNIX操作系統(tǒng)實(shí)現(xiàn)的影響。所有標(biāo)準(zhǔn)化工作的一個重要部分是對每種實(shí)現(xiàn)必須定義的各種限制進(jìn)行說明,所以我們將說明這些限制以及確定其值的各種方法。

UNIX標(biāo)準(zhǔn)化

ISO C

In late 1989, ANSI Standard X3.159-1989 for the C programming language was approved. This standard was also adopted as International Standard ISO/IEC 9899:1990. ANSI is the American National Standards Institute, the U.S. member in the International Organization for Standardization (ISO). IEC stands for the International Electrotechnical Commission. The C standard is now maintained and developed by the ISO/IEC international standardization working group for the C programming language, known as ISO/IEC JTC1/SC22/WG14, or WG14 for short. The intent of the ISO C standard is to provide portability of conforming C programs to a wide variety of operating systems, not only the UNIX System. This standard defines not only the syntax and semantics of the programming language but also a standard library [Chapter 7 of ISO 1999; Plauger 1992; Appendix B of Kernighan and Ritchie 1988]. This library is important because all contemporary UNIX systems, such as the ones described in this book, provide the library routines that are specified in the C standard. In 1999, the ISO C standard was updated and approved as ISO/IEC 9899:1999, largely to improve support for applications that perform numerical processing. The changes don’t affect the POSIX interfaces described in this book, except for the addition of the restrict keyword to some of the function prototypes. This keyword is used to tell the compiler which pointer references can be optimized, by indicating that the object to which the pointer refers is accessed in the function only via that pointer Since 1999, three technical corrigenda have been published to correct errors in the ISO C standard—one in 2001, one in 2004, and one in 2007. As with most standards, there is a delay between the standard’s approval and the modification of software to conform to it. As each vendor’s compilation systems evolve, they add more support for the latest version of the ISO C standard A summary of the current level of conformance of gcc to the 1999 version of the ISO C standard is available at http://gcc.gnu.org/c99status.html. Although the C standard was updated in 2011, we deal only with the 1999 version in this text, because the other standards haven’t yet caught up with the relevant changes. The ISO C library can be divided into 24 areas, based on the headers defined by the standard (see Figure 2.1). The POSIX.1 standard includes these headers, as well as others. As Figure 2.1 shows, all of these headers are supported by the four implementations (FreeBSD 8.0, Linux 3.2.0, Mac OS X 10.6.8, and Solaris 10) that are described later in this chapter.

IEEE POSIX

POSIX is a family of standards initially developed by the IEEE (Institute of Electrical and Electronics Engineers). POSIXstands for Portable Operating System Interface. It originally referred only to the IEEE Standard 1003.1-1988 — the operating system interface — but was later extended to include many of the standards and draft standards with the 1003 designation, including the shell and utilities (1003.2). Of specific interest to this book is the 1003.1 operating system interface standard, whose goal is to promote the portability of applications among various UNIX System environments. This standard defines the services that an operating system must provide if it is to be ‘‘POSIX compliant,’’ and has been adopted by most computer vendors. Although the 1003.1 standard is based on the UNIX operating system, the standard is not restricted to UNIX and UNIX-like systems. Indeed, some vendors supplying proprietary operating systems claim that these systems have been made POSIX compliant, while still leaving all their proprietary featuresin place. Because the 1003.1 standard specifies an interface and not an implementation, no distinction is made between system calls and library functions. All the routines in the standard are called functions. Standards are continually evolving, and the 1003.1 standard is no exception. The 1988 version, IEEE Standard 1003.1-1988, was modified and submitted to the International Organization for Standardization. No new interfaces or features were added, but the text was revised. The resulting document was published as IEEE Standard 1003.1-1990 [IEEE 1990]. This is also International Standard ISO/IEC 9945-1:1990. This standard was commonly referred to as POSIX.1, a term which we’ll use in this text to refer to the different versions of the standard. The IEEE 1003.1 working group continued to make changes to the standard. In 1996, a revised version of the IEEE 1003.1 standard was published. It included the 1003.1-1990 standard, the 1003.1b-1993 real-time extensions standard, and the interfaces for multithreaded programming, called pthreads for POSIX threads. This version of the standard was also published as International Standard ISO/IEC 9945-1:1996. More real- time interfaces were added in 1999 with the publication of IEEE Standard 1003.1d-1999. A year later, IEEE Standard 1003.1j-2000 was published, including even more real-time interfaces, and IEEE Standard 1003.1q-2000 was published, adding event-tracing extensions to the standard. The 2001 version of 1003.1 departed from the prior versions in that it combined several 1003.1 amendments, the 1003.2 standard, and portions of the Single UNIX Specification (SUS), Version 2 (more on this later). The resulting standard, IEEE Standard 1003.1-2001, included the following other standards:
  • ISO/IEC 9945-1 (IEEE Standard 1003.1-1996), which includes
  • ? ? IEEE Standard 1003.1-1990
  • ? ? IEEE Standard 1003.1b-1993 (real-time extensions)
  • ? ? IEEE Standard 1003.1c-1995 (pthreads)
  • ? ? IEEE Standard 1003.1i-1995 (real-time technical corrigenda)
  • IEEE P1003.1a draft standard (system interface amendment)
  • IEEE Standard 1003.1d-1999 (advanced real-time extensions)
  • IEEE Standard 1003.1j-2000 (more advanced real-time extensions)
  • IEEE Standard 1003.1q-2000 (tracing)
  • Parts of IEEE Standard 1003.1g-2000 (protocol-independent interfaces)
  • ISO/IEC 9945-2 (IEEE Standard 1003.2-1993)
  • IEEE P1003.2b draft standard (shell and utilities amendment)
  • IEEE Standard 1003.2d-1994 (batch extensions)
  • The Base Specifications of the Single UNIX Specification, version 2, which include
  • ? ? System Interface Definitions, Issue 5
  • ? ? Commands and Utilities, Issue 5
  • ? ? System Interfaces and Headers, Issue 5
  • Open Group Technical Standard, Networking Services, Issue 5.2
  • ISO/IEC 9899:1999, Programming Languages–C
In 2004, the POSIX.1 specification was updated with technical corrections; more comprehensive changes were made in 2008 and released as Issue 7 of the Base Specifications. ISO approved this version at the end of 2008 and published it in 2009 as International Standard ISO/IEC 9945:2009. It is based on several other standards:
  • IEEE Standard 1003.1, 2004 Edition
  • Open Group Technical Standard, 2006, Extended API Set, Parts 1–4
  • ISO/IEC 9899:1999, including corrigenda
Figure 2.2, Figure 2.3, and Figure 2.4 summarize the required and optional headers as specified by POSIX.1. Because POSIX.1 includes the ISO C standard library functions, it also requires the headers listed in Figure 2.1. All four figures summarize which headers are included in the implementations discussed in this book.
Header FreeBSD 8.0 Linux 3.2.0 Mac OS X 10.6.8 Solaris 10 Description
<aio.h>????asynchronous I/O
<cpio.h>????cpio archive values
<dirent.h>????directory entries
<dlfcn.h>????dynamic linking
<fcntl.h>????file control
<fnmatch.h>????filename-matching types
<glob.h>????pathname pattern-matching and generation
<grp.h>????group file
<iconv.h>????codeset conversion utility
<langinfo.h>????language information constants
<monetary.h>????monetary types and functions
<netdb.h>????network database operations
<nl_types.h>????message catalogs
<poll.h>????poll function
<pthread.h>????threads
<pwd.h>????password file
<regex.h>????regular expressions
<sched.h>????execution scheduling
<semaphore.h>????semaphores
<strings.h>????string operations
<tar.h>????tar archive values
<termios.h>????terminal I/O
<unistd.h>????symbolic constants
<wordexp.h>????word-expansion definitions
<arpa/inet.h>????Internet definitions
<net/if.h>????socket local interfaces
<netinet/in.h>????Internet address family
<netinet/tcp.h>????Transmission Control Protocol definitions
<sys/mman.h>????memory management declarations
<sys/select.h>????select function
<sys/socket.h>????sockets interface
<sys/stat.h>????file status
<sys/statvfs.h>????file system information
<sys/times.h>????process times
<sys/types.h>????primitive system data types
<sys/un.h>????UNIX domain socket definitions
<sys/utsname.h>????system name
<sys/wait.h>????process control
Figure 2.2 Required headers defined by the POSIX standard In this text we describe the 2008 edition of POSIX.1. Its interfaces are divided into required ones and optional ones. The optional interfaces are further divided into 40 sections, based on functionality. The sections containing nonobsolete programming interfaces are summarized in Figure 2.5 with their respective option codes. Option codes are two- to three-character abbreviations that identify the interfaces that belong to each functional area and highlight text describing aspects of the standard that depend on the support of a particular option. Many options deal with real-time extensions.
Header FreeBSD 8.0 Linux 3.2.0 Mac OS X 10.6.8 Solaris 10 Description
<fmtmsg.h>????message display structures
<ftw.h>????file tree walking
<libgen.h>????pathname management functions
<ndbm.h>????database operations
<search.h>????search tables
<syslog.h>????system error logging
<utmpx.h>????user accounting database
<sys/ipc.h>????IPC
<sys/msg.h>????XSI message queues
<sys/resource.h>????resource operations
<sys/sem.h>????XSI semaphores
<sys/shm.h>????XSI shared memory
<sys/time.h>????time types
<sys/uio.h>????vector I/O operations
Figure 2.3 XSI option headers defined by the POSIX standard
Header FreeBSD 8.0 Linux 3.2.0 Mac OS X 10.6.8 Solaris 10 Description
<mqueue.h>????message queues
<spawn.h>????real-time spawn interface
Figure 2.4 Optional headers defined by the POSIX standard
CodeSUS
?mandatory
Symbolic constant Description
ADV?_POSIX_ADVISORY_INFOadvisory information (real-time)
CPT?_POSIX_CPUTIMEprocess CPU time clocks (real-time)
FSC?_POSIX_FSYNCfile synchronization
IP6?_POSIX_IPV6IPv6 interfaces
ML?_POSIX_MEMLOCK process memory locking (real-time)
MLR?_POSIX_MEMLOCK_RANGE memory range locking (real-time)
MON?_POSIX_MONOTONIC_CLOCK monotonic clock (real-time)
MSG?_POSIX_MESSAGE_PASSING message passing (real-time)
MX ?_ _STDC_IEC_559_ _ IEC 60559 floating-point option
PIO?_POSIX_PRIORITIZED_IO prioritized input and output
PS?_POSIX_PRIORITY_SCHEDULINGprocess scheduling (real-time)
RPI ?_POSIX_THREAD_ROBUST_PRIO_INHERITrobust mutex priority inheritance (real-time)
RPP?_POSIX_THREAD_ROBUST_PRIO_PROTECTrobust mutex priority protection (real-time)
RS ?_POSIX_RAW_SOCKETS raw sockets
SHM?_POSIX_SHARED_MEMORY_OBJECTS shared memory objects (real-time)
SIO?_POSIX_SYNCHRONIZED_IO synchronized input and output (real-time)
SPN?_POSIX_SPAWNspawn (real-time)
SS?POSIX_SPORADIC_SERVER process sporadic server (real-time)
TCT ?_POSIX_THREAD_CPUTIME thread CPU time clocks (real-time)
TPI?_POSIX_THREAD_PRIO_INHERIT nonrobust mutex priority inheritance (real-time)
TPP?_POSIX_THREAD_PRIO_PROTECT nonrobust mutex priority protection (real-time)
TPS?_POSIX_THREAD_PRIORITY_SCHEDULINGthread execution scheduling (real-time)
TSA ?_POSIX_THREAD_ATTR_STACKADDR thread stack address attribute
TSH?_POSIX_THREAD_PROCESS_SHARED thread process-shared synchronization
TSP?_POSIX_THREAD_SPORADIC_SERVER thread sporadic server (real-time)
TSS?_POSIX_THREAD_ATTR_STACKSIZE thread stack size address
TYM?_POSIX_TYPED_MEMORY_OBJECTS typed memory objects (real-time)
XSI ?_XOPEN_UNIXX/Open interfaces
Figure 2.5 POSIX.1 optional interface groups and codes ? ? POSIX.1 does not include the notion of a superuser. Instead, certain operations require ‘‘appropriate privileges,’’ although POSIX.1 leaves the definition of this term up to the implementation. UNIX systems that conform to the Department of Defense’s security guidelines have many levels of security. In this text, however, we use the traditional terminology andrefer to operations that require superuser privilege. After more than twenty years of work, the standards are mature and stable. The POSIX.1 standard is maintained by an open working group known as the Austin Group (http://www.opengroup.org/austin). To ensure that they are still relevant, the standards need to be either updated or reaffirmed every so often.

Single UNIX Specification

The Single UNIX Specification, a superset of the POSIX.1 standard, specifies additional interfaces that extend the functionality provided by the POSIX.1 specification. POSIX.1 is equivalent to the Base Specifications portion of the Single UNIX Specification. The X/Open System Interfaces (XSI) option in POSIX.1 describes optional interfaces and defines which optional portions of POSIX.1 must be supported for an implementation to be deemed XSI conforming. These include file synchronization, thread stack address and size attributes, thread process-shared synchronization, and the _XOPEN_UNIX symbolic constant (marked "SUS mandatory" in Figure 2.5). Only XSI- conforming implementations can be called UNIX systems. The Open Group owns the UNIX trademark and uses the Single UNIX Specification to define the interfaces an implementation must support to call itself a UNIX system. Vendors must file conformance statements, pass test suites to verify conformance, and license the right to use the UNIX trademark Several of the interfaces that are optional for XSI-conforming systems are divided into option groups based on common functionality, as follows:
  • Encryption: denoted by the _XOPEN_CRYPT symbolic constant
  • Real-time: denoted by the _XOPEN_REALTIME symbolic constant
  • Advanced real-time
  • Real-time threads: denoted by _XOPEN_REALTIME_THREADS
  • Advanced real-time threads
The Single UNIX Specification is a publication of The Open Group, which was formed in 1996 as a merger of X/Open and the Open Software Foundation (OSF), both industry consortia. X/Open used to publish the X/Open Portability Guide, which adopted specific standards and filled in the gaps where functionality was missing. The goal of these guides was to improve application portability beyond what was possible by merely conforming to published standards. The first version of the Single UNIX Specification was published by X/Open in 1994. It was also known as "Spec 1170", because it contained roughly 1,170 interfaces. It grew out of the Common Open Software Environment (COSE) initiative, whose goal was to improve application portability across all implementations of the UNIX operating system. The COSE group — Sun, IBM, HP, Novell/USL, and OSF—went further than endorsing standards by including interfaces used by common commercial applications. The resulting 1,170 interfaces were selected from these applications, and also included the X/Open Common Application Environment (CAE), Issue 4 (known as "XPG4" as a historical reference to its predecessor, the X/Open Portability Guide), the System V Interface Definition (SVID), Edition 3, Level 1 interfaces, and the OSF Application Environment Specification (AES) Full Use interfaces. The second version of the Single UNIX Specification was published by The Open Group in 1997. The new version added support for threads, real-time interfaces, 64-bit processing, large files, and enhanced multibyte character processing. The third version of the Single UNIX Specification (SUSv3) was published by The Open Group in 2001. The Base Specifications of SUSv3 are the same as IEEE Standard 1003.1-2001 and are divided into four sections: Base Definitions, System Interfaces, Shell and Utilities, and Rationale. SUSv3 also includes X/Open Curses Issue 4, Version 2, but this specification is not part of POSIX.1. In 2002, ISO approved the IEEE Standard 1003.1-2001 as International Standard ISO/IEC 9945:2002. The Open Group updated the 1003.1 standard again in 2003 to include technical corrections, and ISO approved this as International Standard ISO/IEC 9945:2003. In April 2004, The Open Group published the Single UNIX Specification, Version 3, 2004 Edition. It merged more technical corrections into the main text of the standard. In 2008, the Single UNIX Specification was updated, including corrections and newinterfaces, removing obsolete interfaces, and marking other interfaces as being obsolescent in preparation for future removal. Additionally, some previously optionalinterfaces were promoted to nonoptional status, including asynchronous I/O, barriers,clock selection, memory-mapped files, memory protection, reader–writer locks, real-time signals, POSIX semaphores, spin locks, thread-safe functions, threads, timeouts,and timers. The resulting standard is known as Issue 7 of the Base Specifications, and is the same as POSIX.1-2008. The Open Group bundled this version with an updatedX/Open Curses specification and released them as version 4 of the Single UNIXSpecification in 2010. We’ll refer to this as SUSv4.

UNIX系統(tǒng)實(shí)現(xiàn)

The previous section described ISO C, IEEE POSIX, and the Single UNIX Specification — three standards originally created by independent organizations. Standards, however, are interface specifications. How do these standards relate to the real world? These standards are taken by vendors?and turned into actual implementations. In this book, we are interested in both these standards and their implementation. Section 1.1 of McKusick et al. [1996] gives a detailed history (and a nice picture) of the UNIX System family tree(in?Figure 2.5.1). Everything starts from the Sixth Edition (1976) and Seventh Edition (1979) of the UNIX Time-Sharing System on the PDP-11 (usually called Version 6 and Version 7, respectively). These were the first releases widely distributed outside of Bell Laboratories. Three branches of the tree evolved. 1) One at AT&T that led to System III and System V, the so-called commercial versions of the UNIX System. 2) One at the University of California at Berkeley that led to the 4.xBSD implementations. 3) The research version of the UNIX System, developed at the Computing Science Research Center of AT&T Bell Laboratories, that led to the UNIX Time-Sharing System 8th Edition, 9th Edition, and ended with the 10th Edition in 1990. Figure 2.5.1? ?the UNIX System family tree
  • First Edition (V1)
  • |
  • Second Edition (V2)
  • |
  • Third Edition (V3)
  • |
  • Fourth Edition (V4)
  • |
  • Fifth Edition (V5)
  • |
  • Sixth Edition (V6) -----*
  • \ |
  • \ |
  • \ |
  • Seventh Edition (V7) |
  • \ |
  • \ 1BSD
  • 32V |
  • \ 2BSD---------------*
  • \ / |
  • \ / |
  • \/ |
  • 3BSD |
  • | |
  • 4.0BSD 2.7.9BSD
  • | |
  • 4.1BSD --------------> 2.8BSD
  • | |
  • 4.1aBSD -----------\ |
  • | \ |
  • 4.1bBSD \ |
  • | \ |
  • *------ 4.1cBSD --------------> 2.9BSD
  • / | |
  • Eighth Edition | 2.9BSD-Seismo
  • | | |
  • +----<--- 4.2BSD 2.9.1BSD
  • | | |
  • +----<--- 4.3BSD -------------> 2.10BSD
  • | | / |
  • Ninth Edition | / 2.10.1BSD
  • | 4.3BSD Tahoe-----+ |
  • | | \ |
  • | | \ |
  • v | 2.11BSD
  • Tenth Edition | |
  • | 2.11BSD rev #430
  • 4.3BSD NET/1 |
  • | v
  • 4.3BSD Reno
  • |
  • *---------- 4.3BSD NET/2 -------------------+-------------*
  • | | | |
  • 386BSD 0.0 | | BSD/386 ALPHA
  • | | | |
  • 386BSD 0.1 ------------>+ | BSD/386 0.3.[13]
  • | \ | 4.4BSD Alpha |
  • | 386BSD 1.0 | | BSD/386 0.9.[34]
  • | | 4.4BSD |
  • | | / | |
  • | | 4.4BSD-Encumbered | |
  • | NetBSD 0.8 | BSD/386 1.0
  • | | | |
  • FreeBSD 1.0 NetBSD 0.9 | BSD/386 1.1
  • | | .----- 4.4BSD Lite |
  • FreeBSD 1.1 | / / | \ |
  • | | / / | \ |
  • FreeBSD 1.1.5 .---|--------' / | \ |
  • | / | / | \ |
  • FreeBSD 1.1.5.1 / | / | \ |
  • | / NetBSD 1.0 <-' | \ |
  • | / | | \ |
  • FreeBSD 2.0 <--' | | BSD/OS 2.0
  • | \ | |
  • FreeBSD 2.0.5 \ | BSD/OS 2.0.1
  • | .-----\------------- 4.4BSD Lite2 |
  • | | \ | | | | |
  • | | .-----|------Rhapsody | | | |
  • | | | | NetBSD 1.3 | | |
  • | | | | OpenBSD 2.3 | |
  • | | | | BSD/OS 3.0 |
  • FreeBSD 2.1 | | | |
  • | | | | NetBSD 1.1 ------. BSD/OS 2.1
  • | FreeBSD 2.1.5 | | | \ |
  • | | | | NetBSD 1.2 \ BSD/OS 3.0
  • | FreeBSD 2.1.6 | | | \ OpenBSD 2.0 |
  • | | | | | \ | |
  • | FreeBSD 2.1.6.1 | | | \ | |
  • | | | | | \ | |
  • | FreeBSD 2.1.7 | | | | | |
  • | | | | | NetBSD 1.2.1 | |
  • | FreeBSD 2.1.7.1 | | | | |
  • | | | | | |
  • | | | | | |
  • *-FreeBSD 2.2 | | | | |
  • | \ | | | | |
  • | FreeBSD 2.2.1 | | | | |
  • | | | | | | |
  • | FreeBSD 2.2.2 | | | OpenBSD 2.1 |
  • | | | | | | |
  • | FreeBSD 2.2.5 | | | | |
  • | | | | | OpenBSD 2.2 |
  • | | | | NetBSD 1.3 | |
  • | FreeBSD 2.2.6 | | | | | |
  • | | | | | NetBSD 1.3.1 | BSD/OS 3.1
  • | | | | | | OpenBSD 2.3 |
  • | | | | | NetBSD 1.3.2 | |
  • | FreeBSD 2.2.7 | | | | | |
  • | | | | | | | BSD/OS 4.0
  • | v | | | | | |
  • | FreeBSD 2.2.8 | | | | | |
  • | | | | | OpenBSD 2.4 |
  • FreeBSD 3.0 <--------* | | v | |
  • | | | NetBSD 1.3.3 | |
  • *---FreeBSD 3.1 | | | |
  • | | | | | BSD/OS 4.0.1
  • | FreeBSD 3.2----* | NetBSD 1.4 OpenBSD 2.5 |
  • | | | | | | | | |
  • | | | | | | | | |
  • | | | | | | | | |
  • | FreeBSD 3.3 | | | | NetBSD 1.4.1 | |
  • | | | | | | | OpenBSD 2.6 |
  • | FreeBSD 3.4 | | | | | | |
  • | | | | | | | | BSD/OS 4.1
  • FreeBSD 4.0 | | | | | NetBSD 1.4.2 | |
  • | | | | | | | | |
  • | | | | | | | | |
  • | FreeBSD 3.5 | | | | | OpenBSD 2.7 |
  • | | | | | | | | |
  • | FreeBSD 3.5.1 | | | | | | |
  • | | | | | | | |
  • *---FreeBSD 4.1 | | | | | | |
  • | | | | (?) | | | |
  • | FreeBSD 4.1.1 | | / | | | |
  • | | | | / | | | |
  • | FreeBSD 4.2 Darwin/ | NetBSD 1.4.3 | |
  • | | Mac OS X | OpenBSD 2.8 BSD/OS 4.2
  • | | | | | |
  • | | | | | |
  • | | 10.0 NetBSD 1.5 | |
  • | FreeBSD 4.3 | | | | |
  • | | | | | OpenBSD 2.9 |
  • | | | | NetBSD 1.5.1 | |
  • | | | | | | |
  • | FreeBSD 4.4-. | | NetBSD 1.5.2 | |
  • | | | Mac OS X | | | |
  • | | | 10.1 | | OpenBSD 3.0 |
  • | FreeBSD 4.5 | | | | | |
  • | | \ | | | | BSD/OS 4.3
  • | FreeBSD 4.6 \ | | | OpenBSD 3.1 |
  • | | \ | | NetBSD 1.5.3 | |
  • | FreeBSD 4.6.2 Mac OS X | | |
  • | | 10.2 | | |
  • | FreeBSD 4.7 | | | |
  • | | | NetBSD 1.6 OpenBSD 3.2 |
  • | FreeBSD 4.8 | | | | |
  • | | | | NetBSD 1.6.1 | |
  • | |--------. | | | OpenBSD 3.3 BSD/OS 5.0
  • | | \ | | | | |
  • | FreeBSD 4.9 | | | | OpenBSD 3.4 BSD/OS 5.1 ISE
  • | | | | | | |
  • | | | | | NetBSD 1.6.2 |
  • | | | | | | |
  • | | | | | | OpenBSD 3.5
  • | | | | | v |
  • | FreeBSD 4.10 | | | |
  • | | | | | |
  • | FreeBSD 4.11 | | | |
  • | | | | | |
  • | v `-|------|-----------------|---------------------.
  • | | | | \
  • FreeBSD 5.0 | | | |
  • | | | | |
  • FreeBSD 5.1 | | | DragonFly 1.0
  • | \ | | | |
  • | ----- Mac OS X | | |
  • | 10.3 | | |
  • FreeBSD 5.2 | | | |
  • | | | | | |
  • | FreeBSD 5.2.1 | | | |
  • | | | | |
  • *---FreeBSD 5.3 | | | |
  • | | | | OpenBSD 3.6 |
  • | | | NetBSD 2.0 | |
  • | | | | | | | DragonFly 1.2.0
  • | | Mac OS X | | NetBSD 2.0.2 | |
  • | FreeBSD 5.4 10.4 | | | | |
  • | | | | | | OpenBSD 3.7 |
  • | V | | | NetBSD 2.0.3 | |
  • | | | | | | |
  • *---FreeBSD 6.0 | | | v OpenBSD 3.8 |
  • | | | | | | |
  • | V | | \ | |
  • | | | NetBSD 2.1 | |
  • | | | | |
  • | | NetBSD 3.0 | |
  • | | | | DragonFly 1.4.0
  • | | | | |
  • FreeBSD 7 -current | NetBSD -current OpenBSD -current |
  • | | | | |
  • v v v v v
  • SVR4

    UNIX System V Release 4 (SVR4) was a product of AT&T's UNIX System Laboratories (USL, formerly AT&T's UNIX Software Operation). ?SVR4 merged functionality from AT&T UNIX System V Release 3.2 (SVR3.2), the SunOS operating system from Sun Microsystems, the 4.3BSD release from the University of California, and the Xenix system from Microsoft into one coherent operating system. (Xenix was originally developed from Version 7, with many features later taken from System V.)?The SVR4 source code was released in late 1989, with the first end-user copies becoming available during 1990. SVR4 conformed to?both the POSIX 1003.1 standard and the X/Open Portability Guide, Issue 3 (XPG3). AT&T also published the System V Interface Definition (SVID) [AT&T 1989]. Issue 3 of the SVID specified the functionality that an operating system must offer to qualify as a conforming implementation of UNIX System V Release 4. As with POSIX.1, the SVID specified an interface, not an implementation. No distinction was made in the SVID between system calls and library functions. The reference manual for an actual implementation of SVR4 must be consulted to see this distinction [AT&T 1990e].

    4.4BSD

    The Berkeley Software Distribution (BSD) releases were produced and distributed by the Computer Systems Research Group (CSRG) at the University of California at Berkeley.?4.2BSD was released in 1983 and 4.3BSD in 1986. Both of these releases ran on the VAX minicomputer.?The next release, 4.3BSD Tahoe in 1988, also ran on a particular minicomputer called the Tahoe.This was followed in 1990 with the 4.3BSD Reno release; 4.3BSD Reno supported many of the POSIX.1 features. The original BSD systems contained proprietary AT&T source code and were covered by AT&T licenses. To obtain the source code to the BSD system you had to have a UNIX source license from AT&T. This changed as more and more of the AT&T source code was replaced over the years with non-AT&T source code and as many of the new features added to the Berkeley system were derived from non-AT&T sources. In 1989, Berkeley identified much of the non-AT&T source code in the 4.3BSD Tahoe release and made it publicly available as the BSD Networking Software, Release 1.0. Release 2.0 of the BSD Networking Software followed in 1991, which was derived from the 4.3BSD Reno release. The intent was that most, if not all, of the 4.4BSD system would be free of AT&T license restrictions, thus making the source code available to all. 4.4BSD-Lite was intended to be the final release from the CSRG. Its introduction was delayed, however, because of legal battles with USL. Once the legal differences were resolved, 4.4BSD-Lite was released in 1994, fully unencumbered, so no UNIX source license was needed to receive it. The CSRG followed this with a bug-fix release in 1995. This release, 4.4BSD-Lite, release 2, was the final version of BSD from the CSRG. (This version of BSD is described in the book by McKusick et al. [1996].) The UNIX system development done at Berkeley started with PDP-11s, then moved to the VAX minicomputer, and then to other so-called workstations. During the early 1990s, support was provided to Berkeley for the popular 80386-based personal computers, leading to what is called 386BSD. This support was provided by Bill Jolitz and was documented in a series of monthly articles in Dr. Dobb’s Journal throughout 1991. Much of this code appeared in the BSD Networking Software, Release 2.0.

    ?

    FreeBSD

    FreeBSD is based on the 4.4BSD-Lite operating system. The FreeBSD project was formed tocarry on the BSD line after the Computing Science Research Group?(CSRG)?at the University of California at Berkeley decided to end its work on the BSD versions of the UNIX operating system, and the 386BSD project seemed to be neglected for too long. All software produced by the FreeBSD project is freely available in both binary and source forms. The FreeBSD 8.0 operating system was one of the four operating systems used to test the examples in this book. Several other BSD-based free operating systems are available. ?The NetBSD project (http://www.netbsd.org) is similar to the FreeBSD project, but emphasizes portability between hardware platforms. The OpenBSD project (http://www.openbsd.org) is similar to FreeBSD but places a greater emphasis on security.

    Linux

    Linux is an operating system that provides a rich programming environment similar to that of a UNIX System; it is freely available under the GNU Public License. The popularity of Linux is somewhat of a phenomenon in the computer industry. Linux is distinguished by often being the first operating system to support new hardware. Linux was created in 1991 by Linus Torvalds as a replacement for MINIX. A grass-roots effort then sprang up, whereby many developers across the world volunteered their time to use and enhance it.?

    Mac OS X

    Mac OS X is based on entirely different technology than prior versions. The core operating system is called ‘‘Darwin,’’ andis based on a combination of the Mach kernel (Accetta et al. [1986]), the FreeBSD operating system, and an object-oriented framework for drivers and other kernel extensions. As of version 10.5, the Intel port of Mac OS X has been certified to be a UNIX system. (For more information on UNIX certification, see http://www.opengroup.org/certification/idx/unix.html.)

    Solaris

    Solaris is the version of the UNIX System developed by Sun Microsystems (now Oracle). Solaris is based on System V Release 4, but includes more than fifteen years of enhancements from the engineers at Sun Microsystems. It is arguably the only commercially successful SVR4 descendant, and is formally certified to be a UNIX system. In 2005, Sun Microsystems released most of the Solaris operating system source code to the public as part of the OpenSolaris open source operating system in an attempt to build an external developer community around Solaris.

    Other UNIX System

    Other versions of the UNIX system that have been certifiedin the past include ? AIX, IBM’s version of the UNIX System ? HP-UX, Hewlett-Packard’s version of the UNIX System ? IRIX, the UNIX System version shipped by Silicon Graphics ? UnixWare, the UNIX System descended from SVR4 sold by SCO

    標(biāo)準(zhǔn)和實(shí)現(xiàn)的關(guān)系

    The standards that we’ve mentioned define a subset of any actual system. The focus of this book is on four real systems: FreeBSD 8.0, Linux 3.2.0, Mac OS X 10.6.8, and Solaris 10. Although only Mac OS X and Solaris can call themselves UNIX systems, all four provide a similar programming environment. Because all four are POSIX compliant to varying degrees, we will also concentrate on the features required by the POSIX.1 standard, noting any differences between POSIX and the actual implementations of these four systems. Those features and routines that are specific to only a particular implementation are clearly marked. We’ll also note any features that are required on UNIX systems but are optional on other POSIX-conforming systems. Be aware that the implementations provide backward compatibility for features in earlier releases, such as SVR3.2 and 4.3BSD. For example, Solaris supports both the POSIX.1 specification for nonblocking I/O (O_NONBLOCK) and the traditional System V method (O_NDELAY). In this text, we’ll use only the POSIX.1 feature, although we’ll mention the nonstandard feature that it replaces. Similarly, both SVR3.2 and 4.3BSD provided reliable signals in a way that differs from the POSIX.1 standard. In Chapter 10 we describe only the POSIX.1 signal mechanism.

    限制

    The implementations define many magic numbers and constants. Many of these have been hard coded into programs or were determined using ad hoc techniques. With the various standardization efforts that we’ve described, more portable methods are now provided to determine these magic numbers and implementation-defined limits, greatly improving the portability of software written for the UNIX environment. Two types of limits are needed: 1) Compile-time limits (e.g., what’s the largest value of a short integer?) 2) Runtime limits (e.g., how many bytes in a filename?) Compile-time limits can be defined in headers that any program can include at compile time. But runtime limits require the process to call a function to obtain the limit’s value. Additionally, some limits can be fixed on a given implementation—and could therefore be defined statically in a header—yet vary on another implementation and would require a runtime function call. An example of this type of limit is the maximum number of bytes in a filename. Before SVR4, System V historically allowed only 14 bytes in a filename, whereas BSD-derived systems increased this number to 255. Most UNIX System implementations these days support multiple file system types, and each type has its own limit. This is the case of a runtime limit that depends on where in the file system the file in question is located. A filename in the root file system, for example, could have a 14-byte limit, whereas a filename in another file system could have a 255-byte limit. To solve these problems, three types of limits are provided: 1) Compile-time limits (headers) 2) Runtime limits not associated with a file or directory (the sysconf function) 3) Runtime limits that are associated with a file or a directory (the pathconf and fpathconf functions) To further confuse things, if a particular runtime limit does not vary on a given system, it can be defined statically in a header. If it is not defined in a header, however, the application must call one of the three conf functions (which we describe shortly) to determine its value at runtime.
    NameDescriptionMinimum
    ?acceptable value
    Typical value
    CHAR_BIT bits in a char 88
    CHAR_MAX max value of char (see later)127
    CHAR_MIN min value of char (see later)-128
    SCHAR_MAX max value of signed char 127127
    SCHAR_MIN min value of signed char ?127?128
    UCHAR_MAXmax value of unsigned char255 255
    INT_MAX max value of int 32,767 2,147,483,647
    INT_MINmin value of int ?32,767 ?2,147,483,648
    UINT_MAX max value of unsigned int 65,5354,294,967,295
    SHRT_MAX max value of short 32,76732,767
    SHRT_MIN min value of short?32,767?32,768
    USHRT_MAXmax value of unsigned short65,53565,535
    LONG_MAX max value of long 2,147,483,6472,147,483,647
    LONG_MIN min value of long ?2,147,483,647?2,147,483,648
    ULONG_MAX max value of unsigned long 4,294,967,295 4,294,967,295
    LLONG_MAXmax value of long long 9,223,372,036,854,775,807 9,223,372,036,854,775,807
    LLONG_MINmin value of long long?9,223,372,036,854,775,807?9,223,372,036,854,775,808
    ULLONG_MAXmax value of unsigned long long 18,446,744,073,709,551,615 18,446,744,073,709,551,615
    MB_LEN_MAXmax number of bytes multibyte character constant 16
    Figure 2.6 Sizes of integral values from <limits.h>

    ISO C限制

    All of the compile-time limits defined by ISO C are defined in the file <limits.h> (see?Figure 2.6). These constants don’t change in a given system. The third column in?Figure 2.6?shows the minimum acceptable values from the ISO C standard. This allows for a system with 16-bit integers using one’s-complement arithmetic. The fourth column shows the values from a Linux system with 32-bit integers using two’s- complement arithmetic. Note that none of the unsigned data types has a minimum value, as this value must be 0 for an unsigned data type. On a 64-bit system, the values for long integer maximums match the maximum values for long long integers. One difference that we will encounter is whether a system provides signed or unsigned character values. From the fourth column in Figure 2.6, we see that this particular system uses signed characters. We see that CHAR_MIN equals SCHAR_MIN and that CHAR_MAX equals SCHAR_MAX. If the system uses unsigned characters, we would have CHAR_MIN equal to 0 and CHAR_MAX equal to UCHAR_MAX. The floating-point data types in the header <float.h> have a similar set of definitions. Anyone doing serious floating-point work should examine this file. Although the ISO C standard specifies minimum acceptable values for integral data types, POSIX.1 makes extensions to the C standard. To conform to POSIX.1, an implementation must support a minimum value of 2,147,483,647 for INT_MAX, ?2,147,483,647 for INT_MIN, and 4,294,967,295 for UINT_MAX. Because POSIX.1 requires implementations to support an 8-bit char, CHAR_BIT must be 8, SCHAR_MIN must be ?128, SCHAR_MAX must be 127, and UCHAR_MAX must be 255. Another ISO C constant that we’ll encounter is FOPEN_MAX, the minimum number of standard I/O streams that the implementation guarantees can be open at once. This constant is found in the <stdio.h> header, and its minimum value is 8. The POSIX.1 value STREAM_MAX, if defined, must have the same value as FOPEN_MAX. ISO C also defines the constant TMP_MAX in <stdio.h>. It is the maximum number of unique filenames generated by the tmpnam function. We’ll have more to say about this constant in Section 5.13. Although ISO C defines the constant FILENAME_MAX, we avoid using it, because POSIX.1 provides better alternatives (NAME_MAX and PATH_MAX). We’ll see these constants shortly. Figure 2.7shows the values of FILENAME_MAX, FOPEN_MAX, and TMP_MAX on the four platforms we discuss in this book.
    LimitFreeBSD 8.0 Linux 3.2.0 Mac OS X 10.6.8 Solaris 10
    FOPEN_MAX20162020
    TMP_MAX308,915,776238,328308,915,77617,576
    FILENAME_MAX10244096 10241024
    Figure 2.7 ISO limits on various platforms

    POSIX限制

    POSIX.1 defines numerous constants that deal with implementation limits of the operating system. Unfortunately, this is one of the more confusing aspects of POSIX.1. Although POSIX.1 defines numerous limits and constants, we’ll concern ourselves with only the ones that affect the base POSIX.1 interfaces. These limits and constants are divided into the following seven categories: 1) Numerical limits: LONG_BIT, SSIZE_MAX, and WORD_BIT 2) Minimum values: the 25 constants in Figure 2.8 3) Maximum value: _POSIX_CLOCKRES_MIN 4) Runtime increasable values: CHARCLASS_NAME_MAX, COLL_WEIGHTS_MAX, LINE_MAX, NGROUPS_MAX, and RE_DUP_MAX 5) Runtime invariant values, possibly indeterminate: the 17 constants in Figure 2.9 (plus an additional four constants introduced in Section 12.2 and three constants introduced in Section 14.5) 6) Other invariant ?values: NL_ARGMAX, NL_MSGMAX, NL_SETMAX, and NL_TEXTMAX 7) Pathname variable ?values: FILESIZEBITS, LINK_MAX, MAX_CANON, MAX_INPUT, NAME_MAX, PATH_MAX, PIPE_BUF, and SYMLINK_MAX
    Name Description: minimum acceptable value for maximum ... Value
    _POSIX_ARG_MAX length of arguments to exec functions4,096
    _POSIX_CHILD_MAX number of child processes at a time per real user ID25
    _POSIX_DELAYTIMER_MAXnumber of timer expiration overruns32
    _POSIX_HOST_NAME_MAXlength of a host name as returned by gethostname255
    _POSIX_LINK_MAX number of links to a file8
    _POSIX_LOGIN_NAME_MAXlength of a login name9
    _POSIX_MAX_CANONnumber of bytes on a terminal’s canonical input queue255
    _POSIX_MAX_INPUTspace available on a terminal’s input queue255
    _POSIX_NAME_MAX number of bytes in a filename, not including the terminating null14
    _POSIX_NGROUPS_MAX number of simultaneous supplementary group IDs per process8
    _POSIX_OPEN_MAX maximum number of open files per process20
    _POSIX_PATH_MAXnumber of bytes in a pathname, including the terminating null256
    _POSIX_PIPE_BUF number of bytes that can be written atomically to a pipe512
    _POSIX_RE_DUP_MAXnumber of repeated occurrences of a basic regular expression permitted by the regexec and regcomp functions when using the interval notation \{m,n\}255
    _POSIX_RTSIG_MAX number of real-time signal numbers reserved for applications8
    _POSIX_SEM_NSEMS_MAXnumber of semaphores a process can have in use at one time256
    _POSIX_SEM_VALUE_MAXvalue a semaphore can hold32,767
    _POSIX_SIGQUEUE_MAXnumber of queued signals a process can send and have pending32
    _POSIX_SSIZE_MAX value that can be stored in ssize_t object32,767
    _POSIX_STREAM_MAX number of standard I/O streams a process can have open at once8
    _POSIX_SYMLINK_MAX number of bytes in a symbolic link255
    _POSIX_SYMLOOP_MAXnumber of symbolic links that can be traversed during pathname resolution8
    _POSIX_TIMER_MAXnumber of timers per process32
    _POSIX_TTY_NAME_MAX length of a terminal device name, including the terminating null9
    _POSIX_TZNAME_MAX number of bytes for the name of a time zone6
    Figure 2.8 POSIX.1 minimum values from <limits.h> Of these limits and constants, some may be defined in <limits.h>, and others may or may not be defined, depending on certain conditions. We describe the limits and constants that may or may not be defined in Section 2.5.4, when we describe the sysconf, pathconf, and fpathconf functions. The 25 minimum values are shown in Figure 2.8. These minimum values do not change from one system to another. They specify the most restrictive values for these features. A conforming POSIX.1 implementation must provide values that are at least this large. This is why they are called minimums, although their names all contain MAX. Also, to ensure portability, a strictly conforming application must not require a larger value. We describe what each of these constants refers to as we proceed through the text. A strictly conforming POSIX application is different from an application that is merely POSIX conforming. A POSIX-conforming application uses only interfaces defined in IEEE Standard 1003.1-2008. A strictly conforming POSIX application must meet further restrictions, such as not relying on any undefined behavior, not using any obsolescent interfaces, and not requiring values of constants larger than the minimums shown in Figure 2.8.
    NameDescriptionMinimum acceptable value
    ARG_MAXmaximum length of arguments to exec functions_POSIX_ARG_MAX
    ATEXIT_MAX maximum number of functions that can be registered with the atexit function32
    CHILD_MAX maximum number of child processes per real user ID_POSIX_CHILD_MAX
    DELAYTIMER_MAXmaximum number of timer expiration overruns_POSIX_DELAYTIMER_MAX
    HOST_NAME_MAX maximum length of a host name as returned by gethostname_POSIX_HOST_NAME_MAX
    LOGIN_NAME_MAXmaximum length of a login name_POSIX_LOGIN_NAME_MAX
    OPEN_MAXone more than the maximum value assigned to a newly created file descriptor
    賦予新建文件描述符的最大值+1
    _POSIX_OPEN_MAX
    PAGESIZE system memory page size, in bytes1
    RTSIG_MAXmaximum number of real-time signals reserved for application use_POSIX_RTSIG_MAX
    SEM_NSEMS_MAXmaximum number of semaphores a process can use_POSIX_SEM_NSEMS_MAX
    SEM_VALUE_MAXmaximum value of a semaphore_POSIX_SEM_VALUE_MAX
    SIGQUEUE_MAXmaximum number of signals that can be queued for a process_POSIX_SIGQUEUE_MAX
    STREAM_MAXmaximum number of standard I/O streams a process can have open at once_POSIX_STREAM_MAX
    SYMLOOP_MAXnumber of symbolic links that can be traversed during pathname resolution_POSIX_SYMLOOP_MAX
    TIMER_MAX maximum number of timers per process_POSIX_TIMER_MAX
    TTY_NAME_MAXlength of a terminal device name, including the terminating null_POSIX_TTY_NAME_MAX
    TZNAME_MAXnumber of bytes for the name of a time zon_POSIX_TZNAME_MAX
    Figure 2.9 POSIX.1 runtime invariant values from <limits.h> ? ? Unfortunately, some of these invariant minimum values are too small to be of practical use. For example, most UNIX systems today provide far more than 20 open files per process. Also, the minimum limit of 256 for _POSIX_PATH_MAX is too small. Pathnames can exceed this limit. This means that we can’t use the two constants _POSIX_OPEN_MAX and _POSIX_PATH_MAX as array sizes at compile time. Each of the 25 invariant minimum values in Figure Figure 2.8 has an associated implementation value whose name is formed by removing the _POSIX_ prefix from the name in Figure 2.8. The names without the leading _POSIX_ were intended to be the actual values that a given implementation supports. (These 25 implementation values are from items 1, 4, 5, and 7 from our list earlier in this section: 2 of the runtime increasable values, 15 of the runtime invariant values, and 7 of the pathname variable values, along with SSIZE_MAX from the numeric values.) The problem is that not all of the 25 implementation values are guaranteed to be defined in the <limits.h> header. For example, a particular value may not be included in the header if its actual value for a given process depends on the amount of memory on the system. If the values are not defined in the header, we can’t use them as array bounds at compile time. To determine the actual implementation value at runtime, POSIX.1 decided to provide three functions for us to call—sysconf, pathconf, and fpathconf. There is still a problem, however, because some of the values are defined by POSIX.1 as being possibly ‘‘indeterminate’’ (logically infinite). This means that the value has no practical upper bound. On Solaris, for example, the number of functions you can register with atexit to be run when a process ends is limited only by the amount of memory on the system. Thus ATEXIT_MAX is considered indeterminate on Solaris. We’ll return to this problem of indeterminate runtime limits in Section 2.5.5.

    XSI限制

    The XSI option also defines constants representing implementation limits. They include: 1) Minimum values: the five constants in Figure 2.10 2) Runtime invariant values, possibly indeterminate: IOV_MAX and PAGE_SIZE The minimum values are listed in Figure 2.10. The last two illustrate the situation in which the POSIX.1 minimums were too small—presumably to allow for embedded POSIX.1 implementations—so symbols with larger minimum values were added for XSI-conforming systems.
    Name DescriptionMinimum
    acceptable value
    Typical value
    NL_LANGMAX maximum number of bytes in LANG environment variable14 14
    NZERO default process priority2020
    _XOPEN_IOV_MAX maximum number of iovec structures that can be used with readv or writev1616
    _XOPEN_NAME_MAXnumber of bytes in a filename255255
    _XOPEN_PATH_MAXnumber of bytes in a pathname10241024
    Figure 2.10 XSI minimum values from <limits.h>

    函數(shù)sysconfi、pathconf、fpathconf

    We’ve listed various minimum values that an implementation must support, but how do we find out the limits that a particular system actually supports? As we mentioned earlier, some of these limits might be available at compile time; others must be determined at runtime. We’ve also mentioned that some limits don’t change in a given system, whereas others can change because they are associated with a file or directory. The runtime limits are obtained by calling one of the following three functions. ? ? ? ? ? ?
  • #include<unistd.h>
  • ?
  • long sysconf(int name);
  • ?
  • long pathconf(constchar*pathname,int name);
  • ?
  • long fpathconf(int fd,int name);
  • ?
  • All three return: corresponding value if OK,?1 on error (see later)
  • The difference between the last two functions is that one takes a pathname as its argument and the other takes a file descriptor argument. Figure 2.11 lists the name arguments that sysconf uses to identify system limits. Constants beginning with _SC_ are used as arguments to sysconf to identify the runtime limit. Figure 2.12 lists the name arguments that are used by pathconf and fpathconf to identify system limits. Constants beginning with _PC_ are used as arguments to pathconf and fpathconf to identify the runtime limit.
    Name of limit Description name argument
    ARG_MAXmaximum length, in bytes, of arguments to the exec functions_SC_ARG_MAX
    ATEXIT_MAXmaximum number of functions that can be registered with the atexit function_SC_ATEXIT_MAX
    CHILD_MAXmaximum number of processes per real user ID_SC_CHILD_MAX
    clock ticks/secondnumber of clock ticks per second_SC_CLK_TCK
    COLL_WEIGHTS_MAXmaximum number of weights that can be assigned to an entry of the LC_COLLATE order keyword in the locale definition file_SC_COLL_WEIGHTS_MAX
    DELAYTIMER_MAXmaximum number of timer expiration overruns_SC_DELAYTIMER_MAX
    HOST_NAME_MAXmaximum length of a host name as returned by gethostname_SC_HOST_NAME_MAX
    IOV_MAXmaximum number of iovec structures that can be used with readv or writev_SC_IOV_MAX
    LINE_MAXmaximum length of a utility’s input line_SC_LINE_MAX
    LOGIN_NAME_MAXmaximum length of a login name_SC_LOGIN_NAME_MAX
    NGROUPS_MAXmaximum number of simultaneous supplementary process group IDs per process_SC_NGROUPS_MAX
    OPEN_MAXone more than the maximum value assigned to a newly created file descriptor_SC_OPEN_MAX
    PAGESIZEsystem memory page size, in bytes_SC_PAGESIZE
    PAGE_SIZEsystem memory page size, in bytes_SC_PAGE_SIZE
    RE_DUP_MAXnumber of repeated occurrences of a basic regular expression permitted by the regexec and regcomp functions when using the interval notation \{m,n\}_SC_RE_DUP_MAX
    RTSIG_MAXmaximum number of real-time signals reserved for application use_SC_RTSIG_MAX
    SEM_NSEMS_MAXmaximum number of semaphores a process can use at one time_SC_SEM_NSEMS_MAX
    SEM_VALUE_MAXmaximum value of a semaphore_SC_SEM_VALUE_MAX
    SIGQUEUE_MAXmaximum number of signals that can be queued for a process_SC_SIGQUEUE_MAX
    STREAM_MAXmaximum number of standard I/O streams per process at any given time; if defined, it must have the same value as FOPEN_MAX_SC_STREAM_MAX
    SYMLOOP_MAXnumber of symbolic links that can be traversed during pathname resolution_SC_SYMLOOP_MAX
    TIMER_MAXmaximum number of timers per process_SC_TIMER_MAX
    TTY_NAME_MAXlength of a terminal device name, including the terminating null_SC_TTY_NAME_MAX
    TZNAME_MAXmaximum number of bytes for a time zone name_SC_TZNAME_MAX
    Figure 2.11 Limits and name arguments to sysconf We need to look in more detail at the different return values from these three functions. 1)?All three functions return ?1 and set errno to EINVAL if the name isn’t one of the appropriate constants. The third column in Figures 2.11 and 2.12 lists the limit constants we’ll deal with throughout the rest of this book. 2)?Some names can return either the value of the variable (a return value ≥ 0) or an indication that the value is indeterminate. An indeterminate value is indicated by returning ?1 and not changing the value of errno. 3)?The value returned for _SC_CLK_TCK is the number of clock ticks per second, for use with the return values from the times function (Section 8.17). Some restrictions apply to the pathconf pathname argument and the fpathconf fd argument. If any of these restrictions isn’t met, the results are undefined. 1) The referenced file for _PC_MAX_CANON and _PC_MAX_INPUT must be a terminal file. ? 2) The referenced file for _PC_LINK_MAX and _PC_TIMESTAMP_RESOLUTION can be either a file or a directory. If the referenced file is a directory, the return value applies to the directory itself, not to the filename entries within the directory. ? 3) The referenced file for _PC_FILESIZEBITS and _PC_NAME_MAX must be a directory. The return value applies to filenames within the directory. 4) The referenced file for _PC_PATH_MAX must be a directory. The value returned is the maximum length of a relative pathname when the specified directory is the working directory. (Unfortunately, this isn’t the real maximum length of an absolute pathname, which is what we want to know. We’ll return to this problem in Section 2.5.5.) 5) The referenced file for _PC_PIPE_BUF must be a pipe, FIFO, or directory. In the first two cases (pipe or FIFO), the return value is the limit for the referenced pipe or FIFO. For the other case (a directory), the return value is the limit for any FIFO created in that directory.? 6) The referenced file for _PC_SYMLINK_MAX must be a directory. The value returned is the maximum length of the string that a symbolic link in that directory can contain.
    Name of limit Description name argument
    FILESIZEBITSminimum number of bits needed to represent, as a signed integer value, the maximum size of a regular file allowed in the specified directory_PC_FILESIZEBITS
    LINK_MAXmaximum value of a file’s link count_PC_LINK_MAX
    MAX_CANONmaximum number of bytes on a terminal’s canonical input queue_PC_MAX_CANON
    MAX_INPUT number of bytes for which space is available on terminal’s input queue_PC_MAX_INPUT
    NAME_MAX maximum number of bytes in a filename (does not include a null at end)_PC_NAME_MAX
    PATH_MAX maximum number of bytes in a relative pathname, including the terminating null_PC_PATH_MAX
    PIPE_BUF maximum number of bytes that can be written atomically to a pipe_PC_PIPE_BUF
    _POSIX_TIMESTAMP_RESOLUTIONresolution in nanoseconds for file timestamps _PC_TIMESTAMP_RESOLUTION
    SYMLINK_MAXnumber of bytes in a symbolic link_PC_SYMLINK_MAX
    Figure 2.12 Limits and name arguments to pathconf and fpathconf Example The awk(1) program shown in Figure 2.13 builds a C program that prints the value of each pathconf and sysconf symbol.
  • # firewaywei 2016年 08月 18日 星期四 21:22:13 CST
  • #!/usr/bin/awk -f
  • BEGIN {
  • printf("#include \"apue.h\"\n")
  • printf("#include <errno.h>\n")
  • printf("#include <limits.h>\n")
  • printf("\n")
  • printf("static void pr_sysconf(char *, int);\n")
  • printf("static void pr_pathconf(char *, char *, int);\n")
  • printf("\n")
  • printf("int\n")
  • printf("main(int argc, char *argv[])\n")
  • printf("{\n")
  • printf("\tif (argc != 2)\n")
  • printf("\t\terr_quit(\"usage: a.out <dirname>\");\n\n")
  • FS="\t+"
  • while(getline <"sysconf.sym">0){
  • printf("#ifdef %s\n", $1)
  • printf("\tprintf(\"%s defined to be %%ld\\n\", (long)%s + 0);\n",
  • $1, $1)
  • printf("#else\n")
  • printf("\tprintf(\"no symbol for %s\\n\");\n", $1)
  • printf("#endif\n")
  • printf("#ifdef %s\n", $2)
  • printf("\tpr_sysconf(\"%s =\", %s);\n", $1, $2)
  • printf("#else\n")
  • printf("\tprintf(\"no symbol for %s\\n\");\n", $2)
  • printf("#endif\n")
  • printf("\n")
  • }
  • close("sysconf.sym")
  • printf("\n\n")
  • while(getline <"pathconf.sym">0){
  • printf("#ifdef %s\n", $1)
  • printf("\tprintf(\"%s defined to be %%ld\\n\", (long)%s+0);\n",
  • $1, $1)
  • printf("#else\n")
  • printf("\tprintf(\"no symbol for %s\\n\");\n", $1)
  • printf("#endif\n")
  • printf("#ifdef %s\n", $2)
  • printf("\tpr_pathconf(\"%s =\", argv[1], %s);\n", $1, $2)
  • printf("#else\n")
  • printf("\tprintf(\"no symbol for %s\\n\");\n", $2)
  • printf("#endif\n")
  • printf("\n")
  • }
  • close("pathconf.sym")
  • exit
  • }
  • END {
  • printf("\texit(0);\n")
  • printf("}\n\n")
  • printf("static void\n")
  • printf("pr_sysconf(char *mesg, int name)\n")
  • printf("{\n")
  • printf("\tlong val;\n\n")
  • printf("\tfputs(mesg, stdout);\n")
  • printf("\terrno = 0;\n")
  • printf("\tif ((val = sysconf(name)) < 0) {\n")
  • printf("\t\tif (errno != 0) {\n")
  • printf("\t\t\tif (errno == EINVAL)\n")
  • printf("\t\t\t\tfputs(\" (not supported)\\n\", stdout);\n")
  • printf("\t\t\telse\n")
  • printf("\t\t\t\terr_sys(\"sysconf error\");\n")
  • printf("\t\t} else {\n")
  • printf("\t\t\tfputs(\" (no limit)\\n\", stdout);\n")
  • printf("\t\t}\n")
  • printf("\t} else {\n")
  • printf("\t\tprintf(\" %%ld\\n\", val);\n")
  • printf("\t}\n")
  • printf("}\n\n")
  • printf("static void\n")
  • printf("pr_pathconf(char *mesg, char *path, int name)\n")
  • printf("{\n")
  • printf("\tlong val;\n")
  • printf("\n")
  • printf("\tfputs(mesg, stdout);\n")
  • printf("\terrno = 0;\n")
  • printf("\tif ((val = pathconf(path, name)) < 0) {\n")
  • printf("\t\tif (errno != 0) {\n")
  • printf("\t\t\tif (errno == EINVAL)\n")
  • printf("\t\t\t\tfputs(\" (not supported)\\n\", stdout);\n")
  • printf("\t\t\telse\n")
  • printf("\t\t\t\terr_sys(\"pathconf error, path = %%s\", path);\n")
  • printf("\t\t} else {\n")
  • printf("\t\t\tfputs(\" (no limit)\\n\", stdout);\n")
  • printf("\t\t}\n")
  • printf("\t} else {\n")
  • printf("\t\tprintf(\" %%ld\\n\", val);\n")
  • printf("\t}\n")
  • printf("}\n")
  • }
  • Figure 2.13 Build C program to print all supported configuration limits The awk program reads two input files—pathconf.sym and sysconf.sym—that contain lists of the limit name and symbol, separated by tabs. All symbols are not defined on every platform, so the awk program surrounds each call to pathconf and sysconf with the necessary #ifdef statements. For example, the awk program transforms a line in the input file that looks like NAME_MAX ? ? _PC_NAME_MAX into the following C code:
  • #ifdef NAME_MAX
  • printf("NAME_MAX defined to be %ld\n",(long)NAME_MAX+0);
  • #else
  • printf("no symbol for NAME_MAX\n");
  • #endif
  • #ifdef _PC_NAME_MAX
  • pr_pathconf("NAME_MAX =", argv[1], _PC_NAME_MAX);
  • #else
  • printf("no symbol for _PC_NAME_MAX\n");
  • #endif
  • The program in Figure 2.14, generated by the awk program, prints all these limits, handling the case in which a limit is not defined.
  • /**
  • * 文件名: standards/conf.c
  • * 內(nèi)容: 由makeconf.awk腳本自動生成
  • * 時間:2016年 08月 19日 星期五 21:10:48 CST
  • * 作者:firewaywei
  • */
  • #include"apue.h"
  • #include<errno.h>
  • #include<limits.h>
  • staticvoid pr_sysconf(char*,int);
  • staticvoid pr_pathconf(char*,char*,int);
  • int
  • main(int argc,char*argv[])
  • {
  • if(argc !=2)
  • err_quit("usage: a.out <dirname>");
  • #ifdef ARG_MAX
  • printf("ARG_MAX defined to be %ld\n",(long)ARG_MAX +0);
  • #else
  • printf("no symbol for ARG_MAX\n");
  • #endif
  • #ifdef _SC_ARG_MAX
  • pr_sysconf("ARG_MAX =", _SC_ARG_MAX);
  • #else
  • printf("no symbol for _SC_ARG_MAX\n");
  • #endif
  • #ifdef ATEXIT_MAX
  • printf("ATEXIT_MAX defined to be %ld\n",(long)ATEXIT_MAX +0);
  • #else
  • printf("no symbol for ATEXIT_MAX\n");
  • #endif
  • #ifdef _SC_ATEXIT_MAX
  • pr_sysconf("ATEXIT_MAX =", _SC_ATEXIT_MAX);
  • #else
  • printf("no symbol for _SC_ATEXIT_MAX\n");
  • #endif
  • #ifdef CHARCLASS_NAME_MAX
  • printf("CHARCLASS_NAME_MAX defined to be %ld\n",(long)CHARCLASS_NAME_MAX +0);
  • #else
  • printf("no symbol for CHARCLASS_NAME_MAX\n");
  • #endif
  • #ifdef _SC_CHARCLASS_NAME_MAX
  • pr_sysconf("CHARCLASS_NAME_MAX =", _SC_CHARCLASS_NAME_MAX);
  • #else
  • printf("no symbol for _SC_CHARCLASS_NAME_MAX\n");
  • #endif
  • #ifdef CHILD_MAX
  • printf("CHILD_MAX defined to be %ld\n",(long)CHILD_MAX +0);
  • #else
  • printf("no symbol for CHILD_MAX\n");
  • #endif
  • #ifdef _SC_CHILD_MAX
  • pr_sysconf("CHILD_MAX =", _SC_CHILD_MAX);
  • #else
  • printf("no symbol for _SC_CHILD_MAX\n");
  • #endif
  • #ifdef CLOCKTICKSPERSECOND /*clock ticks/second*/
  • printf("CLOCKTICKSPERSECOND /*clock ticks/second*/ defined to be %ld\n",(long)CLOCKTICKSPERSECOND /*clock ticks/second*/+0);
  • #else
  • printf("no symbol for CLOCKTICKSPERSECOND /*clock ticks/second*/\n");
  • #endif
  • #ifdef _SC_CLK_TCK
  • pr_sysconf("CLOCKTICKSPERSECOND /*clock ticks/second*/ =", _SC_CLK_TCK);
  • #else
  • printf("no symbol for _SC_CLK_TCK\n");
  • #endif
  • #ifdef COLL_WEIGHTS_MAX
  • printf("COLL_WEIGHTS_MAX defined to be %ld\n",(long)COLL_WEIGHTS_MAX +0);
  • #else
  • printf("no symbol for COLL_WEIGHTS_MAX\n");
  • #endif
  • #ifdef _SC_COLL_WEIGHTS_MAX
  • pr_sysconf("COLL_WEIGHTS_MAX =", _SC_COLL_WEIGHTS_MAX);
  • #else
  • printf("no symbol for _SC_COLL_WEIGHTS_MAX\n");
  • #endif
  • #ifdef DELAYTIMER_MAX
  • printf("DELAYTIMER_MAX defined to be %ld\n",(long)DELAYTIMER_MAX +0);
  • #else
  • printf("no symbol for DELAYTIMER_MAX\n");
  • #endif
  • #ifdef _SC_DELAYTIMER_MAX
  • pr_sysconf("DELAYTIMER_MAX =", _SC_DELAYTIMER_MAX);
  • #else
  • printf("no symbol for _SC_DELAYTIMER_MAX\n");
  • #endif
  • #ifdef HOST_NAME_MAX
  • printf("HOST_NAME_MAX defined to be %ld\n",(long)HOST_NAME_MAX +0);
  • #else
  • printf("no symbol for HOST_NAME_MAX\n");
  • #endif
  • #ifdef _SC_HOST_NAME_MAX
  • pr_sysconf("HOST_NAME_MAX =", _SC_HOST_NAME_MAX);
  • #else
  • printf("no symbol for _SC_HOST_NAME_MAX\n");
  • #endif
  • #ifdef IOV_MAX
  • printf("IOV_MAX defined to be %ld\n",(long)IOV_MAX +0);
  • #else
  • printf("no symbol for IOV_MAX\n");
  • #endif
  • #ifdef _SC_IOV_MAX
  • pr_sysconf("IOV_MAX =", _SC_IOV_MAX);
  • #else
  • printf("no symbol for _SC_IOV_MAX\n");
  • #endif
  • #ifdef LINE_MAX
  • printf("LINE_MAX defined to be %ld\n",(long)LINE_MAX +0);
  • #else
  • printf("no symbol for LINE_MAX\n");
  • #endif
  • #ifdef _SC_LINE_MAX
  • pr_sysconf("LINE_MAX =", _SC_LINE_MAX);
  • #else
  • printf("no symbol for _SC_LINE_MAX\n");
  • #endif
  • #ifdef LOGIN_NAME_MAX
  • printf("LOGIN_NAME_MAX defined to be %ld\n",(long)LOGIN_NAME_MAX +0);
  • #else
  • printf("no symbol for LOGIN_NAME_MAX\n");
  • #endif
  • #ifdef _SC_LOGIN_NAME_MAX
  • pr_sysconf("LOGIN_NAME_MAX =", _SC_LOGIN_NAME_MAX);
  • #else
  • printf("no symbol for _SC_LOGIN_NAME_MAX\n");
  • #endif
  • #ifdef NGROUPS_MAX
  • printf("NGROUPS_MAX defined to be %ld\n",(long)NGROUPS_MAX +0);
  • #else
  • printf("no symbol for NGROUPS_MAX\n");
  • #endif
  • #ifdef _SC_NGROUPS_MAX
  • pr_sysconf("NGROUPS_MAX =", _SC_NGROUPS_MAX);
  • #else
  • printf("no symbol for _SC_NGROUPS_MAX\n");
  • #endif
  • #ifdef OPEN_MAX
  • printf("OPEN_MAX defined to be %ld\n",(long)OPEN_MAX +0);
  • #else
  • printf("no symbol for OPEN_MAX\n");
  • #endif
  • #ifdef _SC_OPEN_MAX
  • pr_sysconf("OPEN_MAX =", _SC_OPEN_MAX);
  • #else
  • printf("no symbol for _SC_OPEN_MAX\n");
  • #endif
  • #ifdef PAGESIZE
  • printf("PAGESIZE defined to be %ld\n",(long)PAGESIZE +0);
  • #else
  • printf("no symbol for PAGESIZE\n");
  • #endif
  • #ifdef _SC_PAGESIZE
  • pr_sysconf("PAGESIZE =", _SC_PAGESIZE);
  • #else
  • printf("no symbol for _SC_PAGESIZE\n");
  • #endif
  • #ifdef PAGE_SIZE
  • printf("PAGE_SIZE defined to be %ld\n",(long)PAGE_SIZE +0);
  • #else
  • printf("no symbol for PAGE_SIZE\n");
  • #endif
  • #ifdef _SC_PAGE_SIZE
  • pr_sysconf("PAGE_SIZE =", _SC_PAGE_SIZE);
  • #else
  • printf("no symbol for _SC_PAGE_SIZE\n");
  • #endif
  • #ifdef RE_DUP_MAX
  • printf("RE_DUP_MAX defined to be %ld\n",(long)RE_DUP_MAX +0);
  • #else
  • printf("no symbol for RE_DUP_MAX\n");
  • #endif
  • #ifdef _SC_RE_DUP_MAX
  • pr_sysconf("RE_DUP_MAX =", _SC_RE_DUP_MAX);
  • #else
  • printf("no symbol for _SC_RE_DUP_MAX\n");
  • #endif
  • #ifdef RTSIG_MAX
  • printf("RTSIG_MAX defined to be %ld\n",(long)RTSIG_MAX +0);
  • #else
  • printf("no symbol for RTSIG_MAX\n");
  • #endif
  • #ifdef _SC_RTSIG_MAX
  • pr_sysconf("RTSIG_MAX =", _SC_RTSIG_MAX);
  • #else
  • printf("no symbol for _SC_RTSIG_MAX\n");
  • #endif
  • #ifdef SEM_NSEMS_MAX
  • printf("SEM_NSEMS_MAX defined to be %ld\n",(long)SEM_NSEMS_MAX +0);
  • #else
  • printf("no symbol for SEM_NSEMS_MAX\n");
  • #endif
  • #ifdef _SC_SEM_NSEMS_MAX
  • pr_sysconf("SEM_NSEMS_MAX =", _SC_SEM_NSEMS_MAX);
  • #else
  • printf("no symbol for _SC_SEM_NSEMS_MAX\n");
  • #endif
  • #ifdef SEM_VALUE_MAX
  • printf("SEM_VALUE_MAX defined to be %ld\n",(long)SEM_VALUE_MAX +0);
  • #else
  • printf("no symbol for SEM_VALUE_MAX\n");
  • #endif
  • #ifdef _SC_SEM_VALUE_MAX
  • pr_sysconf("SEM_VALUE_MAX =", _SC_SEM_VALUE_MAX);
  • #else
  • printf("no symbol for _SC_SEM_VALUE_MAX\n");
  • #endif
  • #ifdef SIGQUEUE_MAX
  • printf("SIGQUEUE_MAX defined to be %ld\n",(long)SIGQUEUE_MAX +0);
  • #else
  • printf("no symbol for SIGQUEUE_MAX\n");
  • #endif
  • #ifdef _SC_SIGQUEUE_MAX
  • pr_sysconf("SIGQUEUE_MAX =", _SC_SIGQUEUE_MAX);
  • #else
  • printf("no symbol for _SC_SIGQUEUE_MAX\n");
  • #endif
  • #ifdef STREAM_MAX
  • printf("STREAM_MAX defined to be %ld\n",(long)STREAM_MAX +0);
  • #else
  • printf("no symbol for STREAM_MAX\n");
  • #endif
  • #ifdef _SC_STREAM_MAX
  • pr_sysconf("STREAM_MAX =", _SC_STREAM_MAX);
  • #else
  • printf("no symbol for _SC_STREAM_MAX\n");
  • #endif
  • #ifdef SYMLOOP_MAX
  • printf("SYMLOOP_MAX defined to be %ld\n",(long)SYMLOOP_MAX +0);
  • #else
  • printf("no symbol for SYMLOOP_MAX\n");
  • #endif
  • #ifdef _SC_SYMLOOP_MAX
  • pr_sysconf("SYMLOOP_MAX =", _SC_SYMLOOP_MAX);
  • #else
  • printf("no symbol for _SC_SYMLOOP_MAX\n");
  • #endif
  • #ifdef TIMER_MAX
  • printf("TIMER_MAX defined to be %ld\n",(long)TIMER_MAX +0);
  • #else
  • printf("no symbol for TIMER_MAX\n");
  • #endif
  • #ifdef _SC_TIMER_MAX
  • pr_sysconf("TIMER_MAX =", _SC_TIMER_MAX);
  • #else
  • printf("no symbol for _SC_TIMER_MAX\n");
  • #endif
  • #ifdef TTY_NAME_MAX
  • printf("TTY_NAME_MAX defined to be %ld\n",(long)TTY_NAME_MAX +0);
  • #else
  • printf("no symbol for TTY_NAME_MAX\n");
  • #endif
  • #ifdef _SC_TTY_NAME_MAX
  • pr_sysconf("TTY_NAME_MAX =", _SC_TTY_NAME_MAX);
  • #else
  • printf("no symbol for _SC_TTY_NAME_MAX\n");
  • #endif
  • #ifdef TZNAME_MAX
  • printf("TZNAME_MAX defined to be %ld\n",(long)TZNAME_MAX +0);
  • #else
  • printf("no symbol for TZNAME_MAX\n");
  • #endif
  • #ifdef _SC_TZNAME_MAX
  • pr_sysconf("TZNAME_MAX =", _SC_TZNAME_MAX);
  • #else
  • printf("no symbol for _SC_TZNAME_MAX\n");
  • #endif
  • #ifdef FILESIZEBITS
  • printf("FILESIZEBITS defined to be %ld\n",(long)FILESIZEBITS+0);
  • #else
  • printf("no symbol for FILESIZEBITS\n");
  • #endif
  • #ifdef _PC_FILESIZEBITS
  • pr_pathconf("FILESIZEBITS =", argv[1], _PC_FILESIZEBITS);
  • #else
  • printf("no symbol for _PC_FILESIZEBITS\n");
  • #endif
  • #ifdef LINK_MAX
  • printf("LINK_MAX defined to be %ld\n",(long)LINK_MAX+0);
  • #else
  • printf("no symbol for LINK_MAX\n");
  • #endif
  • #ifdef _PC_LINK_MAX
  • pr_pathconf("LINK_MAX =", argv[1], _PC_LINK_MAX);
  • #else
  • printf("no symbol for _PC_LINK_MAX\n");
  • #endif
  • #ifdef MAX_CANON
  • printf("MAX_CANON defined to be %ld\n",(long)MAX_CANON+0);
  • #else
  • printf("no symbol for MAX_CANON\n");
  • #endif
  • #ifdef _PC_MAX_CANON
  • pr_pathconf("MAX_CANON =", argv[1], _PC_MAX_CANON);
  • #else
  • printf("no symbol for _PC_MAX_CANON\n");
  • #endif
  • #ifdef MAX_INPUT
  • printf("MAX_INPUT defined to be %ld\n",(long)MAX_INPUT+0);
  • #else
  • printf("no symbol for MAX_INPUT\n");
  • #endif
  • #ifdef _PC_MAX_INPUT
  • pr_pathconf("MAX_INPUT =", argv[1], _PC_MAX_INPUT);
  • #else
  • printf("no symbol for _PC_MAX_INPUT\n");
  • #endif
  • #ifdef NAME_MAX
  • printf("NAME_MAX defined to be %ld\n",(long)NAME_MAX+0);
  • #else
  • printf("no symbol for NAME_MAX\n");
  • #endif
  • #ifdef _PC_NAME_MAX
  • pr_pathconf("NAME_MAX =", argv[1], _PC_NAME_MAX);
  • #else
  • printf("no symbol for _PC_NAME_MAX\n");
  • #endif
  • #ifdef PATH_MAX
  • printf("PATH_MAX defined to be %ld\n",(long)PATH_MAX+0);
  • #else
  • printf("no symbol for PATH_MAX\n");
  • #endif
  • #ifdef _PC_PATH_MAX
  • pr_pathconf("PATH_MAX =", argv[1], _PC_PATH_MAX);
  • #else
  • printf("no symbol for _PC_PATH_MAX\n");
  • #endif
  • #ifdef PIPE_BUF
  • printf("PIPE_BUF defined to be %ld\n",(long)PIPE_BUF+0);
  • #else
  • printf("no symbol for PIPE_BUF\n");
  • #endif
  • #ifdef _PC_PIPE_BUF
  • pr_pathconf("PIPE_BUF =", argv[1], _PC_PIPE_BUF);
  • #else
  • printf("no symbol for _PC_PIPE_BUF\n");
  • #endif
  • #ifdef SYMLINK_MAX
  • printf("SYMLINK_MAX defined to be %ld\n",(long)SYMLINK_MAX+0);
  • #else
  • printf("no symbol for SYMLINK_MAX\n");
  • #endif
  • #ifdef _PC_SYMLINK_MAX
  • pr_pathconf("SYMLINK_MAX =", argv[1], _PC_SYMLINK_MAX);
  • #else
  • printf("no symbol for _PC_SYMLINK_MAX\n");
  • #endif
  • #ifdef _POSIX_TIMESTAMP_RESOLUTION
  • printf("_POSIX_TIMESTAMP_RESOLUTION defined to be %ld\n",(long)_POSIX_TIMESTAMP_RESOLUTION+0);
  • #else
  • printf("no symbol for _POSIX_TIMESTAMP_RESOLUTION\n");
  • #endif
  • #ifdef _PC_TIMESTAMP_RESOLUTION
  • pr_pathconf("_POSIX_TIMESTAMP_RESOLUTION =", argv[1], _PC_TIMESTAMP_RESOLUTION);
  • #else
  • printf("no symbol for _PC_TIMESTAMP_RESOLUTION\n");
  • #endif
  • exit(0);
  • }
  • staticvoid
  • pr_sysconf(char*mesg,int name)
  • {
  • long val;
  • fputs(mesg, stdout);
  • errno =0;
  • if((val = sysconf(name))<0){
  • if(errno !=0){
  • if(errno == EINVAL)
  • fputs(" (not supported)\n", stdout);
  • else
  • err_sys("sysconf error");
  • }else{
  • fputs(" (no limit)\n", stdout);
  • }
  • }else{
  • printf(" %ld\n", val);
  • }
  • }
  • staticvoid
  • pr_pathconf(char*mesg,char*path,int name)
  • {
  • long val;
  • fputs(mesg, stdout);
  • errno =0;
  • if((val = pathconf(path, name))<0){
  • if(errno !=0){
  • if(errno == EINVAL)
  • fputs(" (not supported)\n", stdout);
  • else
  • err_sys("pathconf error, path = %s", path);
  • }else{
  • fputs(" (no limit)\n", stdout);
  • }
  • }else{
  • printf(" %ld\n", val);
  • }
  • }
  • Figure 2.14 Print all possible sysconf and pathconf values Figure 2.15 summarizes the results from Figure 2.14 for the four systems we discuss in this book. The entry ‘‘no symbol’’ means that the system doesn’t provide a corresponding _SC or _PC symbol to query the value of the constant. Thus the limit is undefined in this case. In contrast, the entry ‘‘unsupported’’ means that the symbol is defined by the system but unrecognized by the sysconf or pathconf functions. The entry ‘‘no limit’’ means that the system defines no limit for the constant, but this doesn’t mean that the limit is infinite; it just means that the limit is indeterminite.
    ????Solaris 10
    LimitFreeBSD?8.0Linux?3.2.0Mac OS X?
    10.6.8
    UFS?file systemPCFS?file system
    ARG_MAX262,1442,097,152262,1442,096,6402,096,640
    ATEXIT_MAX322,147,483,6472,147,483,647no limitno limit
    CHARCLASS_NAME_MAXno symbol2,048141414
    CHILD_MAX1,76047,211266 8,0218,021
    clock ticks/second128100100100100
    COLL_WEIGHTS_MAX025521010
    FILESIZEBITS64646441unsupported
    HOST_NAME_MAX25564255255255
    IOV_MAX1,0241,02410241616
    LINE_MAX2,0482,0482,0482,0482,048
    LINK_MAX32,76765,00032,76732,7671
    LOGIN_NAME_MAX1725625599
    MAX_CANON2552551,024256256
    MAX_INPUT2552551,024512512
    NAME_MAX2552552552558
    NGROUPS_MAX1,02365,536161616
    OPEN_MAX3,5201,024256256256
    PAGESIZE4,0964,0964,0968,1928,192
    PAGE_SIZE4,0964,0964,0968,1928,192
    PATH_MAX1,0244,0961,0241,0241,024
    PIPE_BUF5124,0965125,1205,120
    RE_DUP_MAX25532,767255255255
    STREAM_MAX3,5201620256256
    SYMLINK_MAX1,024no limit2551,0241,024
    SYMLOOP_MAX32no limit322020
    TTY_NAME_MAX25532255128128
    TZNAME_MAX2556255no limitno limit
    Figure 2.15 Examples of configuration limits Beware that some limits are reported incorrectly. For example, on Linux, SYMLOOP_MAX is reportedly unlimited, but an examination of the source code reveals that there is actually a hard-coded limit of 40 for the number of consecutive symbolic links traversed in the absence of a loop (see the follow_link function in fs/namei.c). ? ??
    ? ? Another potential source of inaccuracy in Linux is that the pathconf and fpathconf functions are implemented in the C library. The configuration limits returned by these functions depend on the underlying file system type, so if your file system is unknown to the C library, the functions return an educated guess. 我們在linux平臺上, 對Figure 2.14源碼進(jìn)行gcc -E conf.c -o conf.i, 看一下預(yù)處理以后的文件代碼:
  • # ......
  • ?
  • staticvoid pr_sysconf(char*,int);
  • staticvoid pr_pathconf(char*,char*,int);
  • int
  • main(int argc,char*argv[])
  • {
  • if(argc !=2)
  • err_quit("usage: a.out <dirname>");
  • printf("no symbol for ARG_MAX\n");
  • pr_sysconf("ARG_MAX =", _SC_ARG_MAX);
  • printf("no symbol for ATEXIT_MAX\n");
  • pr_sysconf("ATEXIT_MAX =", _SC_ATEXIT_MAX);
  • printf("CHARCLASS_NAME_MAX defined to be %ld\n",(long)2048+0);
  • pr_sysconf("CHARCLASS_NAME_MAX =", _SC_CHARCLASS_NAME_MAX);
  • printf("no symbol for CHILD_MAX\n");
  • pr_sysconf("CHILD_MAX =", _SC_CHILD_MAX);
  • printf("no symbol for CLOCKTICKSPERSECOND /*clock ticks/second*/\n");
  • pr_sysconf("CLOCKTICKSPERSECOND /*clock ticks/second*/ =", _SC_CLK_TCK);
  • printf("COLL_WEIGHTS_MAX defined to be %ld\n",(long)255+0);
  • pr_sysconf("COLL_WEIGHTS_MAX =", _SC_COLL_WEIGHTS_MAX);
  • printf("DELAYTIMER_MAX defined to be %ld\n",(long)2147483647+0);
  • pr_sysconf("DELAYTIMER_MAX =", _SC_DELAYTIMER_MAX);
  • printf("HOST_NAME_MAX defined to be %ld\n",(long)64+0);
  • pr_sysconf("HOST_NAME_MAX =", _SC_HOST_NAME_MAX);
  • printf("IOV_MAX defined to be %ld\n",(long)1024+0);
  • pr_sysconf("IOV_MAX =", _SC_IOV_MAX);
  • printf("LINE_MAX defined to be %ld\n",(long)2048+0);
  • pr_sysconf("LINE_MAX =", _SC_LINE_MAX);
  • printf("LOGIN_NAME_MAX defined to be %ld\n",(long)256+0);
  • pr_sysconf("LOGIN_NAME_MAX =", _SC_LOGIN_NAME_MAX);
  • printf("NGROUPS_MAX defined to be %ld\n",(long)65536+0);
  • pr_sysconf("NGROUPS_MAX =", _SC_NGROUPS_MAX);
  • printf("no symbol for OPEN_MAX\n");
  • pr_sysconf("OPEN_MAX =", _SC_OPEN_MAX);
  • printf("no symbol for PAGESIZE\n");
  • pr_sysconf("PAGESIZE =", _SC_PAGESIZE);
  • printf("no symbol for PAGE_SIZE\n");
  • pr_sysconf("PAGE_SIZE =", _SC_PAGESIZE);
  • printf("RE_DUP_MAX defined to be %ld\n",(long)(0x7fff)+0);
  • pr_sysconf("RE_DUP_MAX =", _SC_RE_DUP_MAX);
  • printf("RTSIG_MAX defined to be %ld\n",(long)32+0);
  • pr_sysconf("RTSIG_MAX =", _SC_RTSIG_MAX);
  • printf("no symbol for SEM_NSEMS_MAX\n");
  • pr_sysconf("SEM_NSEMS_MAX =", _SC_SEM_NSEMS_MAX);
  • printf("SEM_VALUE_MAX defined to be %ld\n",(long)(2147483647)+0);
  • pr_sysconf("SEM_VALUE_MAX =", _SC_SEM_VALUE_MAX);
  • printf("no symbol for SIGQUEUE_MAX\n");
  • pr_sysconf("SIGQUEUE_MAX =", _SC_SIGQUEUE_MAX);
  • printf("no symbol for STREAM_MAX\n");
  • pr_sysconf("STREAM_MAX =", _SC_STREAM_MAX);
  • printf("no symbol for SYMLOOP_MAX\n");
  • pr_sysconf("SYMLOOP_MAX =", _SC_SYMLOOP_MAX);
  • printf("no symbol for TIMER_MAX\n");
  • pr_sysconf("TIMER_MAX =", _SC_TIMER_MAX);
  • printf("TTY_NAME_MAX defined to be %ld\n",(long)32+0);
  • pr_sysconf("TTY_NAME_MAX =", _SC_TTY_NAME_MAX);
  • printf("no symbol for TZNAME_MAX\n");
  • pr_sysconf("TZNAME_MAX =", _SC_TZNAME_MAX);
  • # 294 "conf.c"
  • printf("no symbol for FILESIZEBITS\n");
  • pr_pathconf("FILESIZEBITS =", argv[1], _PC_FILESIZEBITS);
  • printf("no symbol for LINK_MAX\n");
  • pr_pathconf("LINK_MAX =", argv[1], _PC_LINK_MAX);
  • printf("MAX_CANON defined to be %ld\n",(long)255+0);
  • pr_pathconf("MAX_CANON =", argv[1], _PC_MAX_CANON);
  • printf("MAX_INPUT defined to be %ld\n",(long)255+0);
  • pr_pathconf("MAX_INPUT =", argv[1], _PC_MAX_INPUT);
  • printf("NAME_MAX defined to be %ld\n",(long)255+0);
  • pr_pathconf("NAME_MAX =", argv[1], _PC_NAME_MAX);
  • printf("PATH_MAX defined to be %ld\n",(long)4096+0);
  • pr_pathconf("PATH_MAX =", argv[1], _PC_PATH_MAX);
  • printf("PIPE_BUF defined to be %ld\n",(long)4096+0);
  • pr_pathconf("PIPE_BUF =", argv[1], _PC_PIPE_BUF);
  • printf("no symbol for SYMLINK_MAX\n");
  • pr_pathconf("SYMLINK_MAX =", argv[1], _PC_SYMLINK_MAX);
  • printf("no symbol for _POSIX_TIMESTAMP_RESOLUTION\n");
  • printf("no symbol for _PC_TIMESTAMP_RESOLUTION\n");
  • exit(0);
  • }
  • staticvoid
  • pr_sysconf(char*mesg,int name)
  • {
  • long val;
  • fputs(mesg, stdout);
  • (*__errno_location ())=0;
  • if((val = sysconf(name))<0){
  • if((*__errno_location ())!=0){
  • if((*__errno_location ())==22)
  • fputs(" (not supported)\n", stdout);
  • else
  • err_sys("sysconf error");
  • }else{
  • fputs(" (no limit)\n", stdout);
  • }
  • }else{
  • printf(" %ld\n", val);
  • }
  • }
  • staticvoid
  • pr_pathconf(char*mesg,char*path,int name)
  • {
  • long val;
  • fputs(mesg, stdout);
  • (*__errno_location ())=0;
  • if((val = pathconf(path, name))<0){
  • if((*__errno_location ())!=0){
  • if((*__errno_location ())==22)
  • fputs(" (not supported)\n", stdout);
  • else
  • err_sys("pathconf error, path = %s", path);
  • }else{
  • fputs(" (no limit)\n", stdout);
  • }
  • }else{
  • printf(" %ld\n", val);
  • }
  • }
  • ? ? 結(jié)果如下:? no symbol for ARG_MAX
    ARG_MAX = 2097152
    no symbol for ATEXIT_MAX
    ATEXIT_MAX = 2147483647
    CHARCLASS_NAME_MAX defined to be 2048
    CHARCLASS_NAME_MAX = 2048
    no symbol for CHILD_MAX
    CHILD_MAX = 7884
    no symbol for CLOCKTICKSPERSECOND /*clock ticks/second*/
    CLOCKTICKSPERSECOND /*clock ticks/second*/ = 100
    COLL_WEIGHTS_MAX defined to be 255
    COLL_WEIGHTS_MAX = 255
    DELAYTIMER_MAX defined to be 2147483647
    DELAYTIMER_MAX = 2147483647
    HOST_NAME_MAX defined to be 64
    HOST_NAME_MAX = 64
    IOV_MAX defined to be 1024
    IOV_MAX = 1024
    LINE_MAX defined to be 2048
    LINE_MAX = 2048
    LOGIN_NAME_MAX defined to be 256
    LOGIN_NAME_MAX = 256
    NGROUPS_MAX defined to be 65536
    NGROUPS_MAX = 65536
    no symbol for OPEN_MAX
    OPEN_MAX = 1024
    no symbol for PAGESIZE
    PAGESIZE = 4096
    no symbol for PAGE_SIZE
    PAGE_SIZE = 4096
    RE_DUP_MAX defined to be 32767
    RE_DUP_MAX = 32767
    RTSIG_MAX defined to be 32
    RTSIG_MAX = 32
    no symbol for SEM_NSEMS_MAX
    SEM_NSEMS_MAX = (no limit)
    SEM_VALUE_MAX defined to be 2147483647
    SEM_VALUE_MAX = 2147483647
    no symbol for SIGQUEUE_MAX
    SIGQUEUE_MAX = 7884
    no symbol for STREAM_MAX
    STREAM_MAX = 16
    no symbol for SYMLOOP_MAX
    SYMLOOP_MAX = (no limit)
    no symbol for TIMER_MAX
    TIMER_MAX = (no limit)
    TTY_NAME_MAX defined to be 32
    TTY_NAME_MAX = 32
    no symbol for TZNAME_MAX
    TZNAME_MAX = 6
    no symbol for FILESIZEBITS
    FILESIZEBITS = 64
    no symbol for LINK_MAX
    LINK_MAX = 65000
    MAX_CANON defined to be 255
    MAX_CANON = 255
    MAX_INPUT defined to be 255
    MAX_INPUT = 255
    NAME_MAX defined to be 255
    NAME_MAX = 255
    PATH_MAX defined to be 4096
    PATH_MAX = 4096
    PIPE_BUF defined to be 4096
    PIPE_BUF = 4096
    no symbol for SYMLINK_MAX
    SYMLINK_MAX = (no limit)
    no symbol for _POSIX_TIMESTAMP_RESOLUTION
    no symbol for _PC_TIMESTAMP_RESOLUTION

    不確定的運(yùn)行時限制

    We mentioned that some of the limits can be indeterminate. The problem we encounter is that if these limits aren’t defined in the <limits.h> header, we can’t use them at compile time. But they might not be defined at runtime if their value is indeterminate! Let’s look at two specific cases: allocating storage for a pathname and determining the number of file descriptors.

    Pathnames

    Many programs need to allocate storage for a pathname. Typically, the storage has been allocated at compile time, and various magic numbers—few of which are the correct value — have been used by different programs as the array size: 256, 512, 1024, or the standard I/O constant BUFSIZ. The 4.3BSD constant MAXPATHLEN in the header <sys/param.h> is the correct value, but many 4.3BSD applications didn’t use it. POSIX.1 tries to help with the PATH_MAX value, but if this value is indeterminate, we’re still out of luck. Figure 2.16 shows a function that we’ll use throughout this text to allocate storage dynamically for a pathname
  • /**
  • * 文件名: lib/openmax.c
  • * 內(nèi)容:
  • * 時間: 2016年 08月 19日 星期五 15:23:51 CST
  • * 作者:firewaywei
  • *
  • */
  • #include"apue.h"
  • #include<errno.h>
  • #include<limits.h>
  • #ifdef OPEN_MAX
  • staticlong openmax = OPEN_MAX;
  • #else
  • staticlong openmax =0;
  • #endif
  • /*
  • * If OPEN_MAX is indeterminate, this might be inadequate.
  • */
  • #define OPEN_MAX_GUESS 256
  • long
  • open_max(void)
  • {
  • if(openmax ==0)
  • {/* first time through */
  • errno =0;
  • if((openmax = sysconf(_SC_OPEN_MAX))<0)
  • {
  • if(errno ==0)
  • {
  • openmax = OPEN_MAX_GUESS;/* it's indeterminate */
  • }
  • else
  • {
  • err_sys("sysconf error for _SC_OPEN_MAX");
  • }
  • }
  • }
  • return(openmax);
  • }
  • Figure 2.16 Dynamically allocate space for a pathname If the constant PATH_MAX is defined in <limits.h>, then we’re all set. If it’s not, then we need to call pathconf. The value returned by pathconf is the maximum size of a relative pathname when the first argument is the working directory, so we specify the root as the first argument and add 1 to the result. If pathconf indicates that PATH_MAX is indeterminate, we have to punt and just guess a value.? Versions of POSIX.1 prior to 2001 were unclear as to whether PATH_MAX included a null byte at the end of the pathname. If the operating system implementation conforms to one of these prior versions and doesn’t conform to any version of the Single UNIX Specification (which does require the terminating null byte to be included), we need to add 1 to the amount of memory we allocate for a pathname, just to be on the safe side.? The correct way to handle the case of an indeterminate result depends on how the allocated space is being used. If we are allocating space for a call to getcwd, for example — to return the absolute pathname of the current working directory; see Section 4.23—and if the allocated space is too small, an error is returned and errno is set to ERANGE. We could then increase the allocated space by calling realloc (see Section 7.8 and Exercise 4.16) and try again. We could keep doing this until the call to getcwd succeeded

    Maximum Number of Open Files

    A common sequence of code in a daemon process — a process that runs in the background, not connected to a terminal—is one that closes all open files. Some programs have the following code sequence, assuming the constant NOFILE was defined in the <sys/param.h> header:
  • #include<sys/param.h>
  • for(i =0; i < NOFILE; i++)
  • {
  • close(i);
  • }
  • Other programs use the constant _NFILE that some versions of <stdio.h> provide as the upper limit. Some hard code the upper limit as 20. However, none of these approaches is portable. ?? We would hope to use the POSIX.1 value OPEN_MAX to determine this value portably, but if the value is indeterminate, we still have a problem. If we wrote the following code and if OPEN_MAX was indeterminate, the loop would never execute, since sysconf would return ?1:
  • #include<unistd.h>
  • for(i =0; i < sysconf(_SC_OPEN_MAX); i++)
  • {
  • close(i);
  • }
  • Our best option in this case is just to close all descriptors up to some arbitrary limit — say, 256. We show this technique in Figure 2.17. As with our pathname example, this strategy is not guaranteed to work for all cases, but it’s the best we can do without using a more exotic approach.
  • /**
  • * 文件名: lib/openmax.c
  • * 內(nèi)容:
  • * 時間: 2016年 08月 19日 星期五 15:23:51 CST
  • * 作者:firewaywei
  • *
  • */
  • #include"apue.h"
  • #include<errno.h>
  • #include<limits.h>
  • #ifdef OPEN_MAX
  • staticlong openmax = OPEN_MAX;
  • #else
  • staticlong openmax =0;
  • #endif
  • /*
  • * If OPEN_MAX is indeterminate, this might be inadequate.
  • */
  • #define OPEN_MAX_GUESS 256
  • long
  • open_max(void)
  • {
  • if(openmax ==0)
  • {/* first time through */
  • errno =0;
  • if((openmax = sysconf(_SC_OPEN_MAX))<0)
  • {
  • if(errno ==0)
  • {
  • openmax = OPEN_MAX_GUESS;/* it's indeterminate */
  • }
  • else
  • {
  • err_sys("sysconf error for _SC_OPEN_MAX");
  • }
  • }
  • }
  • return(openmax);
  • }
  • Figure 2.17 Determine the number of file descriptors We might be tempted to call close until we get an error return, but the error return from close (EBADF) doesn’t distinguish between an invalid descriptor and a descriptor that wasn’t open. If we tried this technique and descriptor 9 was not open but descriptor 10 was, we would stop on 9 and never close 10. The dup function (Section 3.12) does return a specific error when OPEN_MAX is exceeded, but duplicating a descriptor a couple of hundred times is an extreme way to determine this value.? Some implementations will return LONG_MAX for limit values that are effectively unlimited. Such is the case with the Linux limit for ATEXIT_MAX (see Figure 2.15). This isn’t a good idea, because it can cause programs to behave badly. For example, we can use the ulimit command built into the Bourne-again shell to change the maximum number of files our processes can have open at one time. This generally requires special (superuser) privileges if the limit is to be effectively unlimited. But once set to infinite, sysconf will report LONG_MAX as the limit for OPEN_MAX. A program that relies on this value as the upper bound of file descriptors to close, as shown in Figure 2.17, will waste a lot of time trying to close 2,147,483,647 file descriptors, most of which aren’t even in use.? Systems that support the XSI option in the Single UNIX Specification will provide the getrlimit(2) function (Section 7.11). It can be used to return the maximum number of descriptors that a process can have open. With it, we can detect that there is no configured upper bound to the number of open files our processes can open, so we can avoid this problem. The OPEN_MAX value is called runtime invariant by POSIX, meaning that its value should not change during the lifetime of a process. But on systems that support the XSI option, we can call the setrlimit(2) function (Section 7.11) to change this value for a running process. (This value can also be changed from the C shell with the limit command, and from the Bourne, Bourne-again, Debian Almquist, and Korn shells with the ulimit command.) If our system supports this functionality, we could change the function in Figure 2.17 to call sysconf every time it is called, not just the first time.

    選項(xiàng)

    We saw the list of POSIX.1 options in Figure 2.5 and discussed XSI option groups in Section 2.2.3. If we are to write portable applications that depend on any of these optionally supported features, we need a portable way to determine whether an implementation supports a given option. Just as with limits (Section 2.5), POSIX.1 defines three ways to do this. 1) Compile-time options are defined in <unistd.h>.? 2) Runtime options that are not associated with a file or a directory are identified with the sysconf function.? 3) Runtime options that are associated with a file or a directory are discovered by calling either the pathconf or the fpathconf function. The options include the symbols listed in the third column of Figure 2.5, as well as the symbols listed in Figures 2.19 and 2.18. If the symbolic constant is not defined, we must use sysconf, pathconf, or fpathconf to determine whether the option is supported. In this case, the name argument to the function is formed by replacing the _POSIX at the beginning of the symbol with _SC or _PC. For constants that begin with _XOPEN, the name argument is formed by prepending the string with _SC or _PC. For example, if the constant _POSIX_RAW_SOCKETS is undefined, we can call sysconf with the name argument set to _SC_RAW_SOCKETS to determine whether the platform supports the raw sockets option. If the constant _XOPEN_UNIX is undefined, we can call sysconf with the name argument set to _SC_XOPEN_UNIX to determine whether the platform supports the XSI option interfaces. For each option, we have three possibilities for a platform’s support status. 1) If the symbolic constant is either undefined or defined to have the value ?1, then the corresponding option is unsupported by the platform at compile time. It is possible to run an old application on a newer system where the option is supported, so a runtime check might indicate the option is supported even though the option wasn’t supported at the time the application was compiled.? 2) If the symbolic constant is defined to be greater than zero, then the corresponding option is supported.? 3) If the symbolic constant is defined to be equal to zero, then we must call sysconf, pathconf, or fpathconf to determine whether the option is supported The symbolic constants used with pathconf and fpathconf are summarized in Figure 2.18. Figure 2.19 summarizes the nonobsolete options and their symbolic constants that can be used with sysconf, in addition to those listed in Figure 2.5. Note that we omit options associated with utility commands.?
    Name of optionIndicates ...name argument
    _POSIX_CHOWN_RESTRICTEDwhether use of chown is restricted_PC_CHOWN_RESTRICTED
    _POSIX_NO_TRUNCwhether filenames longer than NAME_MAX_PC_NO_TRUNC
    _POSIX_VDISABLEif defined, terminal special characters can be disabled with this value_PC_VDISABLE
    _POSIX_ASYNC_IOwhether asynchronous I/O can be used with the associated file_PC_ASYNC_IO
    _POSIX_PRIO_IOwhether prioritized I/O can be used with the associated file_PC_PRIO_IO
    _POSIX_SYNC_IOwhether synchronized I/O can be used with the associated file_PC_SYNC_IO
    _POSIX2_SYMLINKSwhether symbolic links are supported in the directory_PC_2_SYMLINKS
    Figure 2.18 ?Options and name arguments to pathconf and fpathconf
    Name of optionIndicates ...name argument
    _POSIX_ASYNCHRONOUS_IOwhether the implementation supports POSIX asynchronous I/O_SC_ASYNCHRONOUS_IO
    _POSIX_BARRIERSwhether the implementation supports barriers_SC_BARRIERS
    _POSIX_CLOCK_SELECTIONwhether the implementation supports clock selection_SC_CLOCK_SELECTION
    _POSIX_JOB_CONTROLwhether the implementation supports job control_SC_JOB_CONTROL
    _POSIX_MAPPED_FILESwhether the implementation supports memory-mapped files_SC_MAPPED_FILES
    _POSIX_MEMORY_PROTECTIONwhether the implementation supports memory protection_SC_MEMORY_PROTECTION
    _POSIX_READER_WRITER_LOCKSwhether the implementation supports reader–writer locks_SC_READER_WRITER_LOCKS
    _POSIX_REALTIME_SIGNALSwhether the implementation supports real-time signals_SC_REALTIME_SIGNALS
    _POSIX_SAVED_IDSwhether the implementation supports the saved set-user-ID and the saved set-group-ID_SC_SAVED_IDS
    _POSIX_SEMAPHORESwhether the implementation supports POSIX semaphores_SC_SEMAPHORES
    _POSIX_SHELLwhether the implementation supports the POSIX shell_SC_SHELL
    _POSIX_SPIN_LOCKSwhether the implementation supports spin locks_SC_SPIN_LOCKS
    _POSIX_THREAD_SAFE_FUNCTIONSwhether the implementation supports thread-safe functions_SC_THREAD_SAFE_FUNCTIONS
    _POSIX_THREADSwhether the implementation supports threads_SC_THREADS
    _POSIX_TIMEOUTSwhether the implementation supports timeout-based variants of selected functions_SC_TIMEOUTS
    _POSIX_TIMERSwhether the implementation supports timers_SC_TIMERS
    _POSIX_VERSIONthe POSIX.1 version_SC_VERSION
    _XOPEN_CRYPTwhether the implementation supports the XSI encryption option group_SC_XOPEN_CRYPT
    _XOPEN_REALTIMEwhether the implementation supports the XSI real-time option group_SC_XOPEN_REALTIME
    _XOPEN_REALTIME_THREADSwhether the implementation supports the XSI real-time threads option group_SC_XOPEN_REALTIME_THREADS
    _XOPEN_SHMwhether the implementation supports the XSI shared memory option group_SC_XOPEN_SHM
    _XOPEN_VERSIONthe XSI version_SC_XOPEN_VERSION
    Figure 2.19 Options and name arguments to sysconf As with the system limits, there are several points to note regarding how options are treated by sysconf, pathconf, and fpathconf. 1) The value returned for _SC_VERSION indicates the four-digit year and two-digit month of the standard. This value can be 198808L, 199009L, 199506L, or some other value for a later version of the standard. The value associated with Version 3 of the Single UNIX Specification is 200112L (the 2001 edition of POSIX.1). The value associated with Version 4 of the Single UNIX Specification (the 2008 edition of POSIX.1) is 200809L.? 2) The value returned for _SC_XOPEN_VERSION indicates the version of the XSI that the system supports. The value associated with Version 3 of the Single UNIX Specification is 600. The value associated with Version 4 of the Single UNIX Specification (the 2008 edition of POSIX.1) is 700.? 3) The values _SC_JOB_CONTROL, _SC_SAVED_IDS, and _PC_VDISABLE no longer represent optional features. Although XPG4 and prior versions of the Single UNIX Specification required that these features be supported, Version 3 of the Single UNIX Specification is the earliest version where these features are no longer optional in POSIX.1. These symbols are retained for backward compatibility.? 4) Platforms conforming to POSIX.1-2008 are also required to support the following options:
    • _POSIX_ASYNCHRONOUS_IO
    • _POSIX_BARRIERS
    • _POSIX_CLOCK_SELECTION
    • _POSIX_MAPPED_FILES
    • _POSIX_MEMORY_PROTECTION
    • _POSIX_READER_WRITER_LOCKS
    • _POSIX_REALTIME_SIGNALS
    • _POSIX_SEMAPHORES
    • _POSIX_SPIN_LOCKS
    • _POSIX_THREAD_SAFE_FUNCTIONS
    • _POSIX_THREADS
    • _POSIX_TIMEOUTS
    • _POSIX_TIMERS
    These constants are defined to have the value 200809L. Their corresponding _SC symbols are also retained for backward compatibility. 5) _PC_CHOWN_RESTRICTED and _PC_NO_TRUNC return ?1 without changing errno if the feature is not supported for the specified pathname or fd. On all POSIX-conforming systems, the return value will be greater than zero (indicating that the feature is supported).? 6) The referenced file for _PC_CHOWN_RESTRICTED must be either a file or a directory. If it is a directory, the return value indicates whether this option applies to files within that directory.? 7) The referenced file for _PC_NO_TRUNC and _PC_2_SYMLINKS must be a directory.? 8) For _PC_NO_TRUNC, the return value applies to filenames within the directory.? 9) The referenced file for _PC_VDISABLE must be a terminal file.? 10) For _PC_ASYNC_IO, _PC_PRIO_IO, and _PC_SYNC_IO, the referenced file must not be a directory. Figure 2.20 shows several configuration options and their corresponding values on the four sample systems we discuss in this text. An entry is ‘‘unsupported’’ if the system defines the symbolic constant but it has a value of ?1, or if it has a value of 0 but the corresponding sysconf or pathconf call returned ?1. It is interesting to see that some system implementations haven’t yet caught up to the latest version of the Single UNIX Specification.
    ????Solaris 10
    LimitFreeBSD?
    8.0
    Linux?
    3.2.0
    Mac OS X?
    10.6.8
    UFS?file systemPCFS?file system
    _POSIX_CHOWN_RESTRICTED1120011211
    _POSIX_JOB_CONTROL1120011211
    _POSIX_NO_TRUNC112001121unsupported
    _POSIX_SAVED_IDSunsupported120011211
    _POSIX_THREADS200112200809200112200112200112
    _POSIX_VDISABLE255025500
    _POSIX_VERSION200112200809200112200112200112
    _XOPEN_UNIXunsupported1111
    _XOPEN_VERSIONunsupported700600600600
    Figure 2.20 Examples of configuration options

    功能測試宏

    The headers define numerous POSIX.1 and XSI symbols, as we’ve described. Even so, most implementations can add their own definitions to these headers, in addition to the POSIX.1 and XSI definitions. If we want to compile a program so that it depends only on the POSIX definitions and doesn’t conflict with any implementation-defined constants, we need to define the constant _POSIX_C_SOURCE. All the POSIX.1 headers use this constant to exclude any implementation-defined definitions when _POSIX_C_SOURCE is defined. Older versions of the POSIX.1 standard defined the _POSIX_SOURCE constant. This was superseded by the _POSIX_C_SOURCE constant in the 2001 version of POSIX.1. The constants _POSIX_C_SOURCE and _XOPEN_SOURCE are called feature test macros. All feature test macros begin with an underscore. When used, they are typically defined in the cc command, as in cc -D_POSIX_C_SOURCE=200809L ?file.c This causes the feature test macro to be defined before any header files are included by the C program. If we want to use only the POSIX.1 definitions, we can also set the first line of a source file to
  • #define _POSIX_C_SOURCE 200809L
  • To enable the XSI option of Version 4 of the Single UNIX Specification, we need to define the constant _XOPEN_SOURCE to be 700. Besides enabling the XSI option, this has the same effect as defining _POSIX_C_SOURCE to be 200809L as far as POSIX.1 functionality is concerned.? The Single UNIX Specification defines the c99 utility as the interface to the C compilation environment. With it we can compile a file as follows: c99 -D_XOPEN_SOURCE=700 file.c -o file To enable the 1999 ISO C extensions in the gcc C compiler, we use the -std=c99 option, as in gcc -D_XOPEN_SOURCE=700 -std=c99 file.c -o file

    基本系統(tǒng)數(shù)據(jù)類型

    Historically, certain C data types have been associated with certain UNIX system variables. For example, major and minor device numbers have historically been stored in a 16-bit short integer, with 8 bits for the major device number and 8 bits for the minor device number. But many larger systems need more than 256 values for these device numbers, so a different technique is needed. (Indeed, the 32-bit version of Solaris uses 32 bits for the device number: 14 bits for the major and 18 bits for the minor.)? The header <sys/types.h> defines some implementation-dependent data types, called the primitive system data types. More of these data types are defined in other headers as well. These data types are defined in the headers with the C typedef facility. Most end in _t. Figure 2.21 lists many of the primitive system data types that we’ll encounter in this text.?
    TypeDescription
    clock_tcounter of clock ticks (process time)
    comp_tcompressed clock ticks (not defined by POSIX.1)
    dev_tdevice numbers (major and minor)
    fd_setfile descriptor sets
    fpos_tfile position
    gid_tnumeric group IDs
    ino_ti-node numbers
    mode_tfile type, file creation mode
    nlink_tlink counts for directory entries
    off_tfile sizes and offsets (signed) (lseek)
    pid_tprocess IDs and process group IDs (signed)
    pthread_tthread IDs
    ptrdiff_tresult of subtracting two pointers (signed)
    rlim_tresource limits
    sig_atomic_tdata type that can be accessed atomically
    sigset_tsignal set
    size_tsizes of objects (such as strings) (unsigned)
    ssize_tfunctions that return a count of bytes (signed) (read, write)
    time_tcounter of seconds of calendar time
    uid_tnumeric user IDs
    wchar_tcan represent all distinct character codes
    Figure 2.21 Some common primitive system data types ? ? By defining these data types this way, we do not build into our programs implementation details that can change from one system to another. We describe what each of these data types is used for when we encounter them later in the text.

    標(biāo)準(zhǔn)之間的沖突

    All in all, these various standards fit together nicely. Our main concern is any differences between the ISO C standard and POSIX.1, since the Base Specifications of the Single UNIX Specification and POSIX.1 are one and the same. Conflicts are unintended, but if they should arise, POSIX.1 defers to the ISO C standard. However, there are some differences. ISO C defines the function clock to return the amount of CPU time used by a process. The value returned is a clock_t value, but ISO C doesn’t specify its units. To convert this value to seconds, we divide it by CLOCKS_PER_SEC, which is defined in the <time.h> header. POSIX.1 defines the function times that returns both the CPU time (for the caller and all its terminated children) and the clock time. All these time values are clock_t values. The sysconf function is used to obtain the number of clock ticks per second for use with the return values from the times function. What we have is the same data type (clock_t) used to hold measurements of time defined with different units by ISO C and POSIX.1. The difference can be seen in Solaris, where clock returns microseconds (hence CLOCKS_PER_SEC is 1 million), whereas sysconf returns the value 100 for clock ticks per second. Thus we must take care when using variables of type clock_t so that we don’t mix variables with different units.? Another area of potential conflict is when the ISO C standard specifies a function, but doesn’t specify it as strongly as POSIX.1 does. This is the case for functions that require a different implementation in a POSIX environment (with multiple processes) than in an ISO C environment (where very little can be assumed about the host operating system). Nevertheless, POSIX-compliant systems implement the ISO C function for compatibility. The signal function is an example. If we unknowingly use the signal function provided by Solaris (hoping to write portable code that can be run in ISO C environments and under older UNIX systems), it will provide semantics different from the POSIX.1 sigaction function. We’ll have more to say about the signal function in Chapter 10.

    小結(jié)

    Much has happened with the standardization of the UNIX programming environment over the past two and a half decades. We’ve described the dominant standards — ISO C, POSIX, and the Single UNIX Specification—and their effect on the four platforms that we’ll examine in this text—FreeBSD, Linux, Mac OS X, and Solaris. These standards try to define certain parameters that can change with each implementation, but we’ve seen that these limits are imperfect. We’ll encounter many of these limits and magic constants as we proceed through the text.? The bibliography specifies how to obtain copies of the standards discussed in this chapter.

    ?



    來自為知筆記(Wiz)



    轉(zhuǎn)載于:https://www.cnblogs.com/fireway/p/5792536.html

    總結(jié)

    以上是生活随笔為你收集整理的UNIX标准及实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    六十路熟妇乱子伦 | 国产三级久久久精品麻豆三级 | 国产精品久久精品三级 | 131美女爱做视频 | 国产精品办公室沙发 | 欧美自拍另类欧美综合图片区 | 国产精品二区一区二区aⅴ污介绍 | 麻豆国产97在线 | 欧洲 | 亚洲成a人片在线观看无码3d | 欧美黑人巨大xxxxx | 色欲av亚洲一区无码少妇 | 成人欧美一区二区三区黑人 | 四虎永久在线精品免费网址 | 亚洲中文字幕成人无码 | 亚洲 高清 成人 动漫 | 中国大陆精品视频xxxx | 国产人妻精品午夜福利免费 | 国内精品人妻无码久久久影院 | 国产成人精品视频ⅴa片软件竹菊 | 久久无码中文字幕免费影院蜜桃 | 丝袜足控一区二区三区 | 妺妺窝人体色www在线小说 | 波多野结衣乳巨码无在线观看 | 国产成人一区二区三区别 | 免费国产成人高清在线观看网站 | 国产精品美女久久久网av | 国产乱子伦视频在线播放 | 欧美性生交xxxxx久久久 | 国产内射老熟女aaaa | 日韩精品无码免费一区二区三区 | 国产精品无码久久av | 99久久99久久免费精品蜜桃 | 亚洲精品一区三区三区在线观看 | 欧美猛少妇色xxxxx | 无码福利日韩神码福利片 | 一本无码人妻在中文字幕免费 | 色偷偷人人澡人人爽人人模 | 色婷婷欧美在线播放内射 | 亚洲成a人片在线观看无码 | 中文字幕乱码亚洲无线三区 | 久久久久99精品成人片 | 久久精品国产99精品亚洲 | 欧美人与禽zoz0性伦交 | 国产精品香蕉在线观看 | 午夜性刺激在线视频免费 | 国产精品va在线播放 | 精品人人妻人人澡人人爽人人 | √8天堂资源地址中文在线 | 国产成人综合在线女婷五月99播放 | 九九在线中文字幕无码 | www国产亚洲精品久久久日本 | 日本一卡2卡3卡四卡精品网站 | 午夜成人1000部免费视频 | 国产精品毛片一区二区 | 极品嫩模高潮叫床 | 久久国产36精品色熟妇 | 日本熟妇乱子伦xxxx | 亚洲综合另类小说色区 | 一本精品99久久精品77 | 久久99精品久久久久久动态图 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产精品亚洲а∨无码播放麻豆 | 99久久婷婷国产综合精品青草免费 | 国内精品一区二区三区不卡 | 久激情内射婷内射蜜桃人妖 | 日本丰满熟妇videos | 亚洲男女内射在线播放 | 粉嫩少妇内射浓精videos | 东京热男人av天堂 | 激情人妻另类人妻伦 | 久久综合九色综合97网 | 国产精品亚洲一区二区三区喷水 | 国产成人无码av片在线观看不卡 | 久久99精品国产.久久久久 | 人人妻人人澡人人爽人人精品浪潮 | 日本xxxx色视频在线观看免费 | 300部国产真实乱 | 亚洲中文字幕无码中文字在线 | 国产在线精品一区二区高清不卡 | 丰满人妻一区二区三区免费视频 | 精品国产一区二区三区四区在线看 | 日本一卡2卡3卡四卡精品网站 | 熟妇人妻中文av无码 | 色欲人妻aaaaaaa无码 | 亚洲中文字幕在线观看 | 亲嘴扒胸摸屁股激烈网站 | 九九综合va免费看 | 亚洲国产欧美在线成人 | 成人影院yy111111在线观看 | 亚洲日韩一区二区三区 | 亚洲综合在线一区二区三区 | 97无码免费人妻超级碰碰夜夜 | 欧美丰满老熟妇xxxxx性 | 我要看www免费看插插视频 | 亚洲国产精品久久人人爱 | 爽爽影院免费观看 | 国产精品嫩草久久久久 | 亚洲精品欧美二区三区中文字幕 | 1000部夫妻午夜免费 | 无套内射视频囯产 | 帮老师解开蕾丝奶罩吸乳网站 | 天天躁日日躁狠狠躁免费麻豆 | 67194成是人免费无码 | 亚洲精品午夜无码电影网 | 欧美精品无码一区二区三区 | 无码av免费一区二区三区试看 | 国产色精品久久人妻 | 色偷偷人人澡人人爽人人模 | 久久久久久久久888 | 日韩精品无码一区二区中文字幕 | 国产一区二区三区日韩精品 | 在线看片无码永久免费视频 | 午夜精品久久久内射近拍高清 | 狠狠综合久久久久综合网 | 天天爽夜夜爽夜夜爽 | 久久这里只有精品视频9 | 日本一卡二卡不卡视频查询 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲熟熟妇xxxx | 亚洲va中文字幕无码久久不卡 | 久久久久久九九精品久 | 免费观看的无遮挡av | 久久 国产 尿 小便 嘘嘘 | 女人被男人爽到呻吟的视频 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲综合无码久久精品综合 | 人妻尝试又大又粗久久 | 久久精品女人天堂av免费观看 | 亚洲中文字幕av在天堂 | 久久婷婷五月综合色国产香蕉 | 日韩精品一区二区av在线 | 老熟妇乱子伦牲交视频 | 亚洲精品成人av在线 | 少妇被黑人到高潮喷出白浆 | 国产一区二区三区精品视频 | 色综合天天综合狠狠爱 | 天天爽夜夜爽夜夜爽 | 露脸叫床粗话东北少妇 | 免费网站看v片在线18禁无码 | 亚洲日韩av一区二区三区四区 | 国产一区二区三区四区五区加勒比 | 国产精品.xx视频.xxtv | 无码午夜成人1000部免费视频 | 水蜜桃av无码 | 国产成人无码一二三区视频 | 国产亚av手机在线观看 | 人妻少妇精品无码专区动漫 | 成人aaa片一区国产精品 | 日日干夜夜干 | 99久久精品国产一区二区蜜芽 | 3d动漫精品啪啪一区二区中 | 精品乱子伦一区二区三区 | 国产精品视频免费播放 | 欧美日本精品一区二区三区 | 国产综合在线观看 | 日本欧美一区二区三区乱码 | 中文字幕av伊人av无码av | 男人扒开女人内裤强吻桶进去 | 亚洲国产欧美日韩精品一区二区三区 | 国产精品无码成人午夜电影 | 国产成人亚洲综合无码 | 午夜福利一区二区三区在线观看 | 乱人伦人妻中文字幕无码 | 色妞www精品免费视频 | 少妇人妻大乳在线视频 | 成人亚洲精品久久久久软件 | 国产麻豆精品精东影业av网站 | 三上悠亚人妻中文字幕在线 | 色综合久久久无码中文字幕 | 日韩av无码一区二区三区不卡 | 国产成人人人97超碰超爽8 | 国产无遮挡吃胸膜奶免费看 | 97夜夜澡人人双人人人喊 | 精品偷拍一区二区三区在线看 | 久久久久久亚洲精品a片成人 | 精品偷拍一区二区三区在线看 | 国产一区二区三区精品视频 | 国产精品久久久一区二区三区 | 欧美日韩一区二区免费视频 | 久久久久99精品成人片 | 国产在线无码精品电影网 | ass日本丰满熟妇pics | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产成人人人97超碰超爽8 | 国内少妇偷人精品视频免费 | 国产精品内射视频免费 | 欧美精品免费观看二区 | 丁香啪啪综合成人亚洲 | 无码中文字幕色专区 | 无码播放一区二区三区 | 亚洲精品成人福利网站 | 日本免费一区二区三区最新 | 免费人成在线视频无码 | 亚洲精品一区三区三区在线观看 | 亚洲精品久久久久avwww潮水 | 青草视频在线播放 | 日韩av无码中文无码电影 | 精品久久久久久亚洲精品 | 国产口爆吞精在线视频 | 色五月丁香五月综合五月 | 女人色极品影院 | 国产精品久久久久7777 | 日韩无套无码精品 | 少妇性荡欲午夜性开放视频剧场 | 无码任你躁久久久久久久 | 色五月丁香五月综合五月 | www一区二区www免费 | 欧美激情一区二区三区成人 | 精品人妻av区 | 欧美日韩人成综合在线播放 | 欧美日韩人成综合在线播放 | 国产精品18久久久久久麻辣 | 骚片av蜜桃精品一区 | 国产人妻精品午夜福利免费 | 乱码午夜-极国产极内射 | 日韩精品无码一本二本三本色 | 精品无码成人片一区二区98 | 国模大胆一区二区三区 | 人人妻人人澡人人爽欧美一区 | 丰满少妇高潮惨叫视频 | 国产激情一区二区三区 | 奇米影视7777久久精品 | 人人妻人人澡人人爽欧美一区九九 | 一本色道久久综合狠狠躁 | 国产亚洲精品久久久久久大师 | 中文字幕 亚洲精品 第1页 | 久久精品99久久香蕉国产色戒 | 国产亚洲美女精品久久久2020 | 性色欲网站人妻丰满中文久久不卡 | 东京无码熟妇人妻av在线网址 | 中文毛片无遮挡高清免费 | 亚洲日韩av一区二区三区四区 | 国产熟妇高潮叫床视频播放 | 丝袜人妻一区二区三区 | 国产成人综合在线女婷五月99播放 | 亚洲一区二区三区香蕉 | 欧美激情内射喷水高潮 | 成人精品视频一区二区三区尤物 | 色婷婷欧美在线播放内射 | 亚洲男女内射在线播放 | 日本www一道久久久免费榴莲 | 亚洲中文字幕无码一久久区 | 欧美黑人性暴力猛交喷水 | 国产特级毛片aaaaaa高潮流水 | 亚洲色在线无码国产精品不卡 | a国产一区二区免费入口 | 国产精品美女久久久 | 狂野欧美性猛交免费视频 | 国产深夜福利视频在线 | 性色av无码免费一区二区三区 | 人人超人人超碰超国产 | 又湿又紧又大又爽a视频国产 | 久久久精品456亚洲影院 | 乱人伦中文视频在线观看 | 欧美性猛交内射兽交老熟妇 | 中文字幕无码免费久久9一区9 | 国产精品嫩草久久久久 | 377p欧洲日本亚洲大胆 | 国产激情综合五月久久 | 国产内射老熟女aaaa | 午夜福利试看120秒体验区 | 亚洲国产欧美在线成人 | 久久精品人妻少妇一区二区三区 | 全球成人中文在线 | 国产欧美精品一区二区三区 | 又大又黄又粗又爽的免费视频 | av无码不卡在线观看免费 | 国产免费无码一区二区视频 | 水蜜桃色314在线观看 | 人人澡人摸人人添 | 日韩人妻少妇一区二区三区 | 少妇无码一区二区二三区 | 免费观看的无遮挡av | 丰满肥臀大屁股熟妇激情视频 | 国产精品久久久久久亚洲毛片 | 鲁大师影院在线观看 | 欧洲精品码一区二区三区免费看 | 最近中文2019字幕第二页 | 欧美人妻一区二区三区 | 国产真实夫妇视频 | 国产绳艺sm调教室论坛 | 无码国内精品人妻少妇 | 久久久亚洲欧洲日产国码αv | 无码国内精品人妻少妇 | 欧美成人免费全部网站 | 99久久久无码国产aaa精品 | 影音先锋中文字幕无码 | 久久久久人妻一区精品色欧美 | 国精产品一品二品国精品69xx | 亚洲色欲色欲天天天www | 国产熟女一区二区三区四区五区 | 亚洲 另类 在线 欧美 制服 | 婷婷丁香六月激情综合啪 | 国产人妻人伦精品1国产丝袜 | 激情人妻另类人妻伦 | 日本爽爽爽爽爽爽在线观看免 | 东京无码熟妇人妻av在线网址 | 亚洲一区二区三区含羞草 | 精品熟女少妇av免费观看 | www国产精品内射老师 | 亚洲人成网站免费播放 | 国产凸凹视频一区二区 | 国产亚洲精品久久久久久久 | 大肉大捧一进一出视频出来呀 | 国产偷抇久久精品a片69 | 国产精品第一国产精品 | 麻豆人妻少妇精品无码专区 | 内射巨臀欧美在线视频 | 久久久久成人片免费观看蜜芽 | 人妻体内射精一区二区三四 | 亚洲精品无码人妻无码 | 黑人玩弄人妻中文在线 | 亚洲阿v天堂在线 | 欧美第一黄网免费网站 | 夜精品a片一区二区三区无码白浆 | 亚洲成a人片在线观看无码3d | 亚洲va中文字幕无码久久不卡 | 日本高清一区免费中文视频 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产乱码精品一品二品 | 日日噜噜噜噜夜夜爽亚洲精品 | 国内丰满熟女出轨videos | 国产成人午夜福利在线播放 | 99久久精品国产一区二区蜜芽 | 国产亚洲精品久久久久久 | 欧美阿v高清资源不卡在线播放 | 无码国产色欲xxxxx视频 | 四虎影视成人永久免费观看视频 | 精品无码一区二区三区爱欲 | 97久久精品无码一区二区 | 色噜噜亚洲男人的天堂 | 国产麻豆精品一区二区三区v视界 | 初尝人妻少妇中文字幕 | 人人澡人人透人人爽 | 日本一区二区三区免费高清 | 人人妻人人澡人人爽人人精品浪潮 | 丁香花在线影院观看在线播放 | 亚洲中文字幕无码一久久区 | 亚洲一区av无码专区在线观看 | 少妇被粗大的猛进出69影院 | 97精品人妻一区二区三区香蕉 | 日韩视频 中文字幕 视频一区 | 欧美激情综合亚洲一二区 | 亚洲中文字幕无码中文字在线 | 中文亚洲成a人片在线观看 | 国产色精品久久人妻 | 亚洲精品久久久久avwww潮水 | 国产av无码专区亚洲a∨毛片 | 国产精品久久久av久久久 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲精品一区二区三区婷婷月 | 久久亚洲a片com人成 | 久青草影院在线观看国产 | 精品国精品国产自在久国产87 | 免费人成在线观看网站 | 红桃av一区二区三区在线无码av | 无人区乱码一区二区三区 | 亚洲 日韩 欧美 成人 在线观看 | 国产精品欧美成人 | 精品人妻人人做人人爽 | 国产亚洲日韩欧美另类第八页 | 55夜色66夜色国产精品视频 | 久久97精品久久久久久久不卡 | 亚洲日韩乱码中文无码蜜桃臀网站 | 色一情一乱一伦一视频免费看 | 国产亚洲欧美日韩亚洲中文色 | 欧美激情一区二区三区成人 | 激情人妻另类人妻伦 | 国产内射爽爽大片视频社区在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产成人无码专区 | 国产午夜无码精品免费看 | 国产精品资源一区二区 | 国产卡一卡二卡三 | 精品无码成人片一区二区98 | 免费乱码人妻系列无码专区 | 日本www一道久久久免费榴莲 | 无码精品人妻一区二区三区av | 18禁止看的免费污网站 | 漂亮人妻洗澡被公强 日日躁 | 国产成人综合在线女婷五月99播放 | 欧美性生交活xxxxxdddd | 少妇被粗大的猛进出69影院 | 黑人巨大精品欧美一区二区 | 夜精品a片一区二区三区无码白浆 | 成人三级无码视频在线观看 | 乱码午夜-极国产极内射 | 亚洲欧洲日本无在线码 | 久久午夜夜伦鲁鲁片无码免费 | 国产色在线 | 国产 | 激情内射亚州一区二区三区爱妻 | 美女扒开屁股让男人桶 | 久久国产精品_国产精品 | 国产一区二区三区精品视频 | 亚洲精品无码国产 | 久久亚洲精品成人无码 | 狠狠色丁香久久婷婷综合五月 | 桃花色综合影院 | 搡女人真爽免费视频大全 | 无码任你躁久久久久久久 | 国精产品一品二品国精品69xx | 久久国产精品偷任你爽任你 | 国内揄拍国内精品人妻 | 国内精品一区二区三区不卡 | 亚洲国产高清在线观看视频 | 永久黄网站色视频免费直播 | 双乳奶水饱满少妇呻吟 | 国产在线无码精品电影网 | 日韩无套无码精品 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产免费久久精品国产传媒 | 欧美35页视频在线观看 | 欧洲vodafone精品性 | 一区二区传媒有限公司 | 少妇无码一区二区二三区 | 天堂在线观看www | 久久久精品国产sm最大网站 | 在教室伦流澡到高潮hnp视频 | 国产免费久久精品国产传媒 | 亲嘴扒胸摸屁股激烈网站 | 亚洲毛片av日韩av无码 | 欧美日韩人成综合在线播放 | 久久久久久久人妻无码中文字幕爆 | 亚洲精品国产第一综合99久久 | 婷婷丁香五月天综合东京热 | 一本大道久久东京热无码av | 国产真人无遮挡作爱免费视频 | 成人动漫在线观看 | 国产suv精品一区二区五 | 欧美三级不卡在线观看 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国产一区二区三区日韩精品 | 亚洲人成人无码网www国产 | 国内精品一区二区三区不卡 | 九九久久精品国产免费看小说 | yw尤物av无码国产在线观看 | 欧美 丝袜 自拍 制服 另类 | 欧美xxxxx精品 | 免费看男女做好爽好硬视频 | 亚洲成在人网站无码天堂 | 色妞www精品免费视频 | 亚洲a无码综合a国产av中文 | 国产av无码专区亚洲a∨毛片 | 国产女主播喷水视频在线观看 | 中文无码精品a∨在线观看不卡 | 两性色午夜免费视频 | www国产亚洲精品久久久日本 | 国色天香社区在线视频 | 国产色xx群视频射精 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 男女爱爱好爽视频免费看 | 国产午夜福利100集发布 | 牲欲强的熟妇农村老妇女视频 | 中文字幕无线码免费人妻 | 男女作爱免费网站 | 亚洲日韩中文字幕在线播放 | 欧美日韩视频无码一区二区三 | 亚洲中文字幕无码中文字在线 | 女人被爽到呻吟gif动态图视看 | 日韩欧美中文字幕公布 | 中文字幕无码av波多野吉衣 | 女人高潮内射99精品 | 欧美日韩久久久精品a片 | 国产精品亚洲а∨无码播放麻豆 | 色婷婷久久一区二区三区麻豆 | 久久综合给久久狠狠97色 | 国产又爽又猛又粗的视频a片 | 成人欧美一区二区三区黑人免费 | 精品国产精品久久一区免费式 | 成熟女人特级毛片www免费 | 日产精品99久久久久久 | 伊人久久婷婷五月综合97色 | 精品国精品国产自在久国产87 | 国产69精品久久久久app下载 | а√天堂www在线天堂小说 | 狠狠躁日日躁夜夜躁2020 | 亚洲精品成人av在线 | 亚洲另类伦春色综合小说 | 中文字幕日产无线码一区 | 国产亚洲tv在线观看 | 2020久久香蕉国产线看观看 | 国产一区二区不卡老阿姨 | 人妻无码αv中文字幕久久琪琪布 | 日产精品99久久久久久 | 久9re热视频这里只有精品 | 国产乱人偷精品人妻a片 | 亚洲国产高清在线观看视频 | 欧美国产日韩久久mv | 国产av久久久久精东av | 久久午夜无码鲁丝片午夜精品 | 国产精品a成v人在线播放 | 久激情内射婷内射蜜桃人妖 | 成人av无码一区二区三区 | 亚洲欧美中文字幕5发布 | 无码播放一区二区三区 | 精品久久久久久人妻无码中文字幕 | 夜夜躁日日躁狠狠久久av | 青青久在线视频免费观看 | 男人和女人高潮免费网站 | 无码福利日韩神码福利片 | 偷窥日本少妇撒尿chinese | 无码国产激情在线观看 | 青春草在线视频免费观看 | 午夜无码人妻av大片色欲 | 丝袜人妻一区二区三区 | 欧美人与牲动交xxxx | 国产明星裸体无码xxxx视频 | 搡女人真爽免费视频大全 | 中国女人内谢69xxxxxa片 | 色综合久久网 | 青青草原综合久久大伊人精品 | 亚洲欧洲中文日韩av乱码 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 偷窥村妇洗澡毛毛多 | 欧美精品国产综合久久 | 中国大陆精品视频xxxx | 免费国产成人高清在线观看网站 | 狠狠色噜噜狠狠狠7777奇米 | 精品人妻中文字幕有码在线 | 中文字幕无码日韩专区 | 人人妻人人澡人人爽人人精品 | 999久久久国产精品消防器材 | 国产97色在线 | 免 | 欧美老妇交乱视频在线观看 | 久久久精品成人免费观看 | 精品熟女少妇av免费观看 | 午夜精品一区二区三区在线观看 | 国产成人午夜福利在线播放 | 影音先锋中文字幕无码 | 日本高清一区免费中文视频 | 爆乳一区二区三区无码 | 精品欧洲av无码一区二区三区 | av人摸人人人澡人人超碰下载 | 麻豆国产97在线 | 欧洲 | 未满成年国产在线观看 | 色婷婷综合激情综在线播放 | 未满小14洗澡无码视频网站 | 欧美日本免费一区二区三区 | 乱码午夜-极国产极内射 | 蜜桃视频插满18在线观看 | 日本大乳高潮视频在线观看 | 国产精品欧美成人 | 亚洲阿v天堂在线 | 清纯唯美经典一区二区 | 国产麻豆精品精东影业av网站 | 亚洲国产精华液网站w | 欧美成人家庭影院 | 久久午夜无码鲁丝片午夜精品 | 午夜肉伦伦影院 | 中文毛片无遮挡高清免费 | 精品一区二区不卡无码av | 婷婷综合久久中文字幕蜜桃三电影 | 欧美熟妇另类久久久久久多毛 | 国产三级久久久精品麻豆三级 | 天干天干啦夜天干天2017 | 国产猛烈高潮尖叫视频免费 | 国产精品理论片在线观看 | 丰满人妻一区二区三区免费视频 | 中文字幕无线码 | 国产免费观看黄av片 | 亚洲の无码国产の无码影院 | 麻豆精品国产精华精华液好用吗 | 少妇久久久久久人妻无码 | 久久亚洲日韩精品一区二区三区 | 青青青手机频在线观看 | 久久久亚洲欧洲日产国码αv | 精品国产精品久久一区免费式 | 亚洲乱码日产精品bd | 欧美老妇与禽交 | 国产精品久久久久9999小说 | 好爽又高潮了毛片免费下载 | 秋霞成人午夜鲁丝一区二区三区 | 无码一区二区三区在线观看 | 国精产品一品二品国精品69xx | 日本va欧美va欧美va精品 | 理论片87福利理论电影 | 日韩少妇内射免费播放 | 国产精品人妻一区二区三区四 | 国产午夜手机精彩视频 | 四虎4hu永久免费 | 亚洲成a人片在线观看日本 | 亚洲第一网站男人都懂 | 国产午夜亚洲精品不卡 | 人人超人人超碰超国产 | 97精品人妻一区二区三区香蕉 | 免费无码的av片在线观看 | 少妇一晚三次一区二区三区 | 全黄性性激高免费视频 | 日本一区二区三区免费播放 | 国产三级精品三级男人的天堂 | 久久精品国产一区二区三区 | 国内综合精品午夜久久资源 | 麻豆国产丝袜白领秘书在线观看 | 一本无码人妻在中文字幕免费 | 国产精品亚洲专区无码不卡 | 国产午夜亚洲精品不卡下载 | 欧美三级不卡在线观看 | 日日噜噜噜噜夜夜爽亚洲精品 | 精品久久久中文字幕人妻 | 在线天堂新版最新版在线8 | 精品国精品国产自在久国产87 | 免费视频欧美无人区码 | 国产女主播喷水视频在线观看 | 亚洲s码欧洲m码国产av | 少妇性荡欲午夜性开放视频剧场 | 天堂а√在线地址中文在线 | 色婷婷欧美在线播放内射 | 亚洲人成影院在线观看 | 色婷婷av一区二区三区之红樱桃 | 国产精品igao视频网 | 久久午夜无码鲁丝片午夜精品 | 国产偷自视频区视频 | 中文字幕乱妇无码av在线 | 小sao货水好多真紧h无码视频 | 精品 日韩 国产 欧美 视频 | 国产婷婷色一区二区三区在线 | 日本精品人妻无码77777 天堂一区人妻无码 | 香港三级日本三级妇三级 | 强开小婷嫩苞又嫩又紧视频 | 波多野结衣一区二区三区av免费 | 18禁黄网站男男禁片免费观看 | 中文字幕无码免费久久9一区9 | 夜夜夜高潮夜夜爽夜夜爰爰 | 久久精品成人欧美大片 | 欧美野外疯狂做受xxxx高潮 | 亚洲人成影院在线无码按摩店 | 国产乱人偷精品人妻a片 | 性生交大片免费看女人按摩摩 | 在线播放亚洲第一字幕 | 2019午夜福利不卡片在线 | 国内精品久久久久久中文字幕 | 鲁大师影院在线观看 | 少妇的肉体aa片免费 | 任你躁国产自任一区二区三区 | 国产av无码专区亚洲a∨毛片 | 精品一区二区不卡无码av | 欧洲熟妇精品视频 | 欧美 亚洲 国产 另类 | 国产精品亚洲五月天高清 | 亚洲中文字幕无码中字 | 久久亚洲精品成人无码 | 亚洲综合精品香蕉久久网 | 伊人色综合久久天天小片 | 成人片黄网站色大片免费观看 | 欧美日本日韩 | 亚洲另类伦春色综合小说 | 无码人妻丰满熟妇区五十路百度 | 久久无码专区国产精品s | 久久午夜无码鲁丝片 | 未满小14洗澡无码视频网站 | 国产香蕉尹人视频在线 | 全黄性性激高免费视频 | 大乳丰满人妻中文字幕日本 | 午夜嘿嘿嘿影院 | 久久精品国产日本波多野结衣 | 久久久久成人精品免费播放动漫 | 麻花豆传媒剧国产免费mv在线 | 无码av免费一区二区三区试看 | 久久久久99精品国产片 | 伊人久久婷婷五月综合97色 | 色一情一乱一伦一区二区三欧美 | 装睡被陌生人摸出水好爽 | 成人aaa片一区国产精品 | 装睡被陌生人摸出水好爽 | 波多野结衣乳巨码无在线观看 | a国产一区二区免费入口 | 男女下面进入的视频免费午夜 | 人妻少妇被猛烈进入中文字幕 | 无码成人精品区在线观看 | 亚洲aⅴ无码成人网站国产app | av无码久久久久不卡免费网站 | 日日夜夜撸啊撸 | 狠狠色噜噜狠狠狠7777奇米 | 亚洲精品午夜无码电影网 | а√资源新版在线天堂 | 午夜理论片yy44880影院 | 性开放的女人aaa片 | 亚洲乱码中文字幕在线 | 久久亚洲中文字幕精品一区 | 久久精品人妻少妇一区二区三区 | 人妻无码αv中文字幕久久琪琪布 | 任你躁国产自任一区二区三区 | 日韩少妇内射免费播放 | 7777奇米四色成人眼影 | 图片区 小说区 区 亚洲五月 | 九九久久精品国产免费看小说 | 成人无码精品1区2区3区免费看 | 国产精品亚洲五月天高清 | 日韩精品a片一区二区三区妖精 | 奇米影视7777久久精品 | 天下第一社区视频www日本 | 亚洲精品一区三区三区在线观看 | 亚洲爆乳大丰满无码专区 | 99久久精品无码一区二区毛片 | 色一情一乱一伦一区二区三欧美 | 老司机亚洲精品影院 | 领导边摸边吃奶边做爽在线观看 | 丝袜美腿亚洲一区二区 | 无码人妻丰满熟妇区五十路百度 | 无码国产色欲xxxxx视频 | 久久久久国色av免费观看性色 | 婷婷色婷婷开心五月四房播播 | 99er热精品视频 | 97久久超碰中文字幕 | 中文字幕无码视频专区 | 久久久久99精品成人片 | 午夜精品久久久久久久久 | 亚洲 激情 小说 另类 欧美 | 亚洲国产av精品一区二区蜜芽 | 波多野结衣高清一区二区三区 | 精品人人妻人人澡人人爽人人 | 成人女人看片免费视频放人 | 国产真实乱对白精彩久久 | 丰满少妇人妻久久久久久 | 国产精品va在线观看无码 | 亚洲 高清 成人 动漫 | 欧美性色19p | 中文字幕乱码人妻无码久久 | 国产成人综合美国十次 | 欧美性生交xxxxx久久久 | 日日天干夜夜狠狠爱 | 国产9 9在线 | 中文 | 国产精品久久国产三级国 | 中文字幕av无码一区二区三区电影 | 国产精品美女久久久网av | 国产精品99久久精品爆乳 | 亚洲欧美国产精品专区久久 | 亚洲精品一区二区三区大桥未久 | 亚洲爆乳精品无码一区二区三区 | 初尝人妻少妇中文字幕 | 成人片黄网站色大片免费观看 | 老熟女重囗味hdxx69 | 久久亚洲日韩精品一区二区三区 | 国内少妇偷人精品视频免费 | 日本护士xxxxhd少妇 | 伊人久久大香线蕉亚洲 | 国产成人无码午夜视频在线观看 | 亚洲熟妇色xxxxx欧美老妇y | www成人国产高清内射 | 国产精品办公室沙发 | 国产精品免费大片 | 日韩人妻无码一区二区三区久久99 | 撕开奶罩揉吮奶头视频 | 日韩精品成人一区二区三区 | 日本一区二区三区免费播放 | 少妇久久久久久人妻无码 | 丝袜人妻一区二区三区 | 欧美性猛交xxxx富婆 | 欧美真人作爱免费视频 | 久久婷婷五月综合色国产香蕉 | 东京无码熟妇人妻av在线网址 | 精品一区二区三区无码免费视频 | 国产亚洲精品久久久久久大师 | 久久综合色之久久综合 | 精品国产乱码久久久久乱码 | 亚洲va中文字幕无码久久不卡 | 成 人 网 站国产免费观看 | www一区二区www免费 | a在线观看免费网站大全 | 日韩成人一区二区三区在线观看 | av人摸人人人澡人人超碰下载 | 国产精品毛多多水多 | 日日碰狠狠躁久久躁蜜桃 | 免费网站看v片在线18禁无码 | 精品一区二区三区无码免费视频 | 精品久久久无码人妻字幂 | 免费观看激色视频网站 | 日韩视频 中文字幕 视频一区 | 成人亚洲精品久久久久软件 | 人妻熟女一区 | 麻花豆传媒剧国产免费mv在线 | 中文字幕无码人妻少妇免费 | 国产免费观看黄av片 | 一本精品99久久精品77 | 在线亚洲高清揄拍自拍一品区 | 国产无av码在线观看 | 永久免费观看美女裸体的网站 | 日日摸天天摸爽爽狠狠97 | 国产精品人人爽人人做我的可爱 | 乌克兰少妇xxxx做受 | 国产精品嫩草久久久久 | 久久久久久久久888 | 福利一区二区三区视频在线观看 | 国产午夜无码视频在线观看 | 纯爱无遮挡h肉动漫在线播放 | 妺妺窝人体色www在线小说 | 波多野结衣一区二区三区av免费 | 亚洲国产精品久久久天堂 | 成 人 免费观看网站 | 精品一二三区久久aaa片 | 乌克兰少妇xxxx做受 | 成人无码精品一区二区三区 | 国产精品99久久精品爆乳 | 熟妇女人妻丰满少妇中文字幕 | 亚洲 高清 成人 动漫 | 亚洲一区二区三区无码久久 | 国产99久久精品一区二区 | 亚洲中文字幕va福利 | 亚洲国产精品成人久久蜜臀 | 激情爆乳一区二区三区 | 色一情一乱一伦一区二区三欧美 | 亚洲 高清 成人 动漫 | 国产精品高潮呻吟av久久 | 狠狠色欧美亚洲狠狠色www | 欧美zoozzooz性欧美 | 丰满少妇人妻久久久久久 | 亚洲日韩一区二区三区 | 亲嘴扒胸摸屁股激烈网站 | 国产亚洲日韩欧美另类第八页 | 国产三级精品三级男人的天堂 | 99精品无人区乱码1区2区3区 | 精品久久综合1区2区3区激情 | 纯爱无遮挡h肉动漫在线播放 | 丁香啪啪综合成人亚洲 | 丁香啪啪综合成人亚洲 | 国内老熟妇对白xxxxhd | 撕开奶罩揉吮奶头视频 | 色婷婷久久一区二区三区麻豆 | 狠狠亚洲超碰狼人久久 | 东京热一精品无码av | 国产亚洲精品久久久久久大师 | 精品无码国产一区二区三区av | 亚洲国产欧美日韩精品一区二区三区 | 国产一区二区三区日韩精品 | 国产人妻久久精品二区三区老狼 | 熟女少妇在线视频播放 | 国产人妻人伦精品 | 黄网在线观看免费网站 | 免费人成在线观看网站 | 精品国产一区二区三区av 性色 | 国产精品亚洲lv粉色 | 中文字幕乱妇无码av在线 | 少妇性荡欲午夜性开放视频剧场 | 国精品人妻无码一区二区三区蜜柚 | 国内综合精品午夜久久资源 | 国产精品成人av在线观看 | 亚洲色成人中文字幕网站 | 国语精品一区二区三区 | 99久久精品国产一区二区蜜芽 | 久久久www成人免费毛片 | 亚洲 高清 成人 动漫 | 日韩欧美中文字幕公布 | 永久黄网站色视频免费直播 | 国产精品va在线观看无码 | 四十如虎的丰满熟妇啪啪 | 成人一区二区免费视频 | 又大又硬又黄的免费视频 | 老熟妇仑乱视频一区二区 | 无遮无挡爽爽免费视频 | 亚洲 a v无 码免 费 成 人 a v | 欧美丰满老熟妇xxxxx性 | 色妞www精品免费视频 | 5858s亚洲色大成网站www | 欧美亚洲国产一区二区三区 | 精品熟女少妇av免费观看 | 亚洲区欧美区综合区自拍区 | 波多野结衣一区二区三区av免费 | 精品夜夜澡人妻无码av蜜桃 | 国产av久久久久精东av | 亚洲欧美综合区丁香五月小说 | 疯狂三人交性欧美 | 精品国产一区av天美传媒 | 精品夜夜澡人妻无码av蜜桃 | 久久zyz资源站无码中文动漫 | 麻豆蜜桃av蜜臀av色欲av | 内射老妇bbwx0c0ck | 亚洲色欲色欲欲www在线 | 亚洲国产成人a精品不卡在线 | 国产高潮视频在线观看 | 亚洲欧美日韩成人高清在线一区 | 色老头在线一区二区三区 | 国产又爽又猛又粗的视频a片 | 丰满人妻精品国产99aⅴ | 日日夜夜撸啊撸 | 亚洲国产精品久久久天堂 | 18禁黄网站男男禁片免费观看 | 国产亚洲精品久久久久久国模美 | 色婷婷av一区二区三区之红樱桃 | 日本丰满护士爆乳xxxx | 小sao货水好多真紧h无码视频 | 夜精品a片一区二区三区无码白浆 | 久久天天躁夜夜躁狠狠 | 国产办公室秘书无码精品99 | 99久久亚洲精品无码毛片 | 国产午夜精品一区二区三区嫩草 | 丰满人妻精品国产99aⅴ | 国产乱人伦偷精品视频 | 麻豆av传媒蜜桃天美传媒 | 成人免费视频视频在线观看 免费 | 最新版天堂资源中文官网 | 人人妻人人澡人人爽欧美精品 | 国产特级毛片aaaaaa高潮流水 | 少妇一晚三次一区二区三区 | 欧美freesex黑人又粗又大 | 真人与拘做受免费视频一 | 夜夜高潮次次欢爽av女 | 青青草原综合久久大伊人精品 | 国产极品美女高潮无套在线观看 | 亚洲欧洲无卡二区视頻 | 成人免费视频在线观看 | 男人扒开女人内裤强吻桶进去 | 欧洲欧美人成视频在线 | 亚洲精品成a人在线观看 | 久久人人97超碰a片精品 | 7777奇米四色成人眼影 | 成人女人看片免费视频放人 | 久久 国产 尿 小便 嘘嘘 | 久久午夜无码鲁丝片秋霞 | 国产成人久久精品流白浆 | 国产人成高清在线视频99最全资源 | 澳门永久av免费网站 | 九九久久精品国产免费看小说 | 精品一区二区三区波多野结衣 | 亚洲国产日韩a在线播放 | 国产精品美女久久久久av爽李琼 | 亚洲国产av美女网站 | 超碰97人人做人人爱少妇 | 国产精品对白交换视频 | 青青草原综合久久大伊人精品 | 久久99精品国产麻豆蜜芽 | 久久久久久久人妻无码中文字幕爆 | 55夜色66夜色国产精品视频 | 天下第一社区视频www日本 | 国产热a欧美热a在线视频 | 久久天天躁狠狠躁夜夜免费观看 | 精品无码国产一区二区三区av | 对白脏话肉麻粗话av | 2020久久香蕉国产线看观看 | 国产莉萝无码av在线播放 | 精品国产av色一区二区深夜久久 | 国内精品人妻无码久久久影院 | 国模大胆一区二区三区 | 亚洲人成人无码网www国产 | 伊人久久大香线焦av综合影院 | 久久久久99精品成人片 | 国产无套粉嫩白浆在线 | 鲁鲁鲁爽爽爽在线视频观看 | 纯爱无遮挡h肉动漫在线播放 | 日韩 欧美 动漫 国产 制服 | 国产成人无码av片在线观看不卡 | 欧美午夜特黄aaaaaa片 | 免费无码av一区二区 | 久久久久免费精品国产 | 国产亲子乱弄免费视频 | 欧美精品国产综合久久 | 亚洲精品午夜无码电影网 | 自拍偷自拍亚洲精品被多人伦好爽 | 中文字幕中文有码在线 | 成人免费视频一区二区 | 黑森林福利视频导航 | 中文精品久久久久人妻不卡 | 欧美人与禽zoz0性伦交 | 无码福利日韩神码福利片 | 久久久久久国产精品无码下载 | 亚洲热妇无码av在线播放 | 色一情一乱一伦一区二区三欧美 | 精品无人国产偷自产在线 | 装睡被陌生人摸出水好爽 | 国产在线aaa片一区二区99 | 欧美成人家庭影院 | 久久精品一区二区三区四区 | 国产亚洲精品久久久久久久 | 伊人色综合久久天天小片 | 国产真人无遮挡作爱免费视频 | 小sao货水好多真紧h无码视频 | 久久精品国产大片免费观看 | 丁香花在线影院观看在线播放 | 美女黄网站人色视频免费国产 | 激情综合激情五月俺也去 | 久久久久亚洲精品男人的天堂 | 少妇人妻偷人精品无码视频 | 国产精品毛多多水多 | 永久免费精品精品永久-夜色 | 中文亚洲成a人片在线观看 | 久久久www成人免费毛片 | 国产手机在线αⅴ片无码观看 | 亚洲精品国偷拍自产在线麻豆 | 国产亚洲tv在线观看 | 国产精品毛多多水多 | 高清国产亚洲精品自在久久 | 青青草原综合久久大伊人精品 | 亚洲成av人片天堂网无码】 | 国产乡下妇女做爰 | 日本在线高清不卡免费播放 | 99久久人妻精品免费一区 | 无码精品人妻一区二区三区av | 色情久久久av熟女人妻网站 | 在线a亚洲视频播放在线观看 | 久久久久久a亚洲欧洲av冫 | 亚洲中文字幕在线观看 | 国产高清不卡无码视频 | 野外少妇愉情中文字幕 | 国产亚洲人成在线播放 | 高潮毛片无遮挡高清免费视频 | 日日摸天天摸爽爽狠狠97 | 亚欧洲精品在线视频免费观看 | 狠狠色欧美亚洲狠狠色www | 亚洲中文无码av永久不收费 | 亚洲国产精品毛片av不卡在线 | 日韩av无码中文无码电影 | 久久综合久久自在自线精品自 | 两性色午夜免费视频 | 亚洲综合在线一区二区三区 | 中文字幕+乱码+中文字幕一区 | 日韩欧美成人免费观看 | 国产性生交xxxxx无码 | 人妻人人添人妻人人爱 | 国产精品手机免费 | 1000部夫妻午夜免费 | 亚洲色www成人永久网址 | 成人综合网亚洲伊人 | 亚洲 另类 在线 欧美 制服 | 亚洲中文字幕无码中字 | 国内精品九九久久久精品 | 色综合久久88色综合天天 | 香港三级日本三级妇三级 | a片在线免费观看 | 国产人妻人伦精品 | 亚洲中文字幕在线无码一区二区 | 久久精品人妻少妇一区二区三区 | 2019nv天堂香蕉在线观看 | 天堂а√在线地址中文在线 | 国产真实伦对白全集 | 亚洲小说春色综合另类 | 欧美成人午夜精品久久久 | 宝宝好涨水快流出来免费视频 | 久久99精品久久久久久动态图 | 日韩av无码一区二区三区 | 少妇无码吹潮 | 内射白嫩少妇超碰 | 无码午夜成人1000部免费视频 | 午夜免费福利小电影 | 亚洲日韩一区二区 | 亚洲自偷精品视频自拍 | √天堂资源地址中文在线 | 荫蒂添的好舒服视频囗交 | www国产精品内射老师 | 精品一区二区三区波多野结衣 | 中文无码伦av中文字幕 | 少妇高潮喷潮久久久影院 | 97久久超碰中文字幕 | 最新国产麻豆aⅴ精品无码 | 亚洲国产欧美日韩精品一区二区三区 | 婷婷综合久久中文字幕蜜桃三电影 | 久久zyz资源站无码中文动漫 | 伦伦影院午夜理论片 | 无码av免费一区二区三区试看 | 亚洲小说图区综合在线 | 人妻无码久久精品人妻 | 精品国精品国产自在久国产87 | 国产成人无码区免费内射一片色欲 | 国产精品高潮呻吟av久久 | 在线成人www免费观看视频 | 欧美日韩色另类综合 | 97人妻精品一区二区三区 | 人妻夜夜爽天天爽三区 | 久久亚洲a片com人成 | 4hu四虎永久在线观看 | 欧美熟妇另类久久久久久不卡 | 亚洲国产欧美国产综合一区 | 狠狠色噜噜狠狠狠7777奇米 | 成 人 网 站国产免费观看 | 国产又爽又黄又刺激的视频 | 国产偷抇久久精品a片69 | 女高中生第一次破苞av | 亚洲国产欧美日韩精品一区二区三区 | 鲁鲁鲁爽爽爽在线视频观看 | 精品国产福利一区二区 | 波多野结衣aⅴ在线 | 天堂无码人妻精品一区二区三区 | 天天拍夜夜添久久精品大 | 一本久久伊人热热精品中文字幕 | 男人和女人高潮免费网站 | 久久精品人妻少妇一区二区三区 | 亚洲中文字幕va福利 | 久久国产精品_国产精品 | 高清无码午夜福利视频 | 欧美日本精品一区二区三区 | 图片小说视频一区二区 | 亚洲成av人在线观看网址 | 亚洲精品国产品国语在线观看 | 男人扒开女人内裤强吻桶进去 | 在线亚洲高清揄拍自拍一品区 | 国产精品亚洲а∨无码播放麻豆 | 亚洲国产一区二区三区在线观看 | 俺去俺来也www色官网 | 天堂а√在线中文在线 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 少妇性l交大片欧洲热妇乱xxx | 樱花草在线播放免费中文 | 国产舌乚八伦偷品w中 | 婷婷综合久久中文字幕蜜桃三电影 | 国产成人精品久久亚洲高清不卡 | 免费人成在线观看网站 | 久久精品国产一区二区三区 | 欧美大屁股xxxxhd黑色 | 亚洲国产欧美日韩精品一区二区三区 | 久久亚洲中文字幕精品一区 | 98国产精品综合一区二区三区 | 亚洲 日韩 欧美 成人 在线观看 | 国产免费久久精品国产传媒 | 亚洲一区二区三区偷拍女厕 | 亚洲国产高清在线观看视频 | 亚洲大尺度无码无码专区 | 老司机亚洲精品影院无码 | 久久精品国产一区二区三区肥胖 | 国产猛烈高潮尖叫视频免费 | 秋霞特色aa大片 | 国产人妻精品一区二区三区 | 久久精品中文闷骚内射 | 中文亚洲成a人片在线观看 | 免费男性肉肉影院 | 呦交小u女精品视频 | 成人欧美一区二区三区 | 久久久久久久人妻无码中文字幕爆 | 亚洲爆乳精品无码一区二区三区 | 精品无人区无码乱码毛片国产 | 香港三级日本三级妇三级 | 国内少妇偷人精品视频免费 | 成人影院yy111111在线观看 | 国内精品久久久久久中文字幕 | 性欧美疯狂xxxxbbbb | 国产成人精品久久亚洲高清不卡 | 国产亚洲视频中文字幕97精品 | 人妻与老人中文字幕 | 欧美激情一区二区三区成人 | 内射后入在线观看一区 | 国产精品视频免费播放 | 四虎国产精品一区二区 | 国内精品人妻无码久久久影院 | 2020久久超碰国产精品最新 | 色一情一乱一伦一视频免费看 | 欧美成人午夜精品久久久 | 久久精品国产99精品亚洲 | 亚洲国产精品无码久久久久高潮 | 亚洲一区二区三区无码久久 | 2019nv天堂香蕉在线观看 | 国产一区二区三区影院 | 最新国产乱人伦偷精品免费网站 | 精品一区二区三区无码免费视频 | 天海翼激烈高潮到腰振不止 | 色婷婷久久一区二区三区麻豆 | 内射爽无广熟女亚洲 | 亚洲а∨天堂久久精品2021 | 在线天堂新版最新版在线8 | 无码午夜成人1000部免费视频 | 国内少妇偷人精品视频 | 亚洲午夜无码久久 | 蜜臀aⅴ国产精品久久久国产老师 | 国产成人无码一二三区视频 | 麻花豆传媒剧国产免费mv在线 | 国产午夜手机精彩视频 | 日韩av无码中文无码电影 | 一本精品99久久精品77 | 午夜成人1000部免费视频 | 97无码免费人妻超级碰碰夜夜 | 亚洲乱码国产乱码精品精 | 成 人 网 站国产免费观看 | 在线观看国产午夜福利片 | 久久综合久久自在自线精品自 | 久久99热只有频精品8 | 天干天干啦夜天干天2017 | 亚洲人成人无码网www国产 | 国产av久久久久精东av | 亚洲一区二区三区国产精华液 | 国产成人综合在线女婷五月99播放 | 国产精品va在线播放 | 伊人久久大香线蕉av一区二区 | a国产一区二区免费入口 | 国产精品久久久久久无码 | 国产口爆吞精在线视频 | 18精品久久久无码午夜福利 | 丰满人妻被黑人猛烈进入 | 国产精品久久久 | 国产在线无码精品电影网 | 国产精品久久久久久亚洲毛片 | 久久熟妇人妻午夜寂寞影院 | 久久午夜无码鲁丝片午夜精品 | 成人试看120秒体验区 | 熟妇人妻无码xxx视频 | 国产色xx群视频射精 | 日本乱人伦片中文三区 | 免费国产成人高清在线观看网站 | 日日鲁鲁鲁夜夜爽爽狠狠 | 草草网站影院白丝内射 | 久久综合激激的五月天 | 在线观看国产一区二区三区 | 欧美激情综合亚洲一二区 | 日本爽爽爽爽爽爽在线观看免 | 中国女人内谢69xxxx | 欧美 日韩 亚洲 在线 | 免费人成在线视频无码 | 久久精品女人的天堂av | 亚洲色偷偷男人的天堂 | 好男人www社区 | 国产成人精品久久亚洲高清不卡 | 欧美精品在线观看 | 色爱情人网站 | 蜜桃无码一区二区三区 | 午夜嘿嘿嘿影院 | 夜精品a片一区二区三区无码白浆 | 日韩欧美中文字幕在线三区 | 性做久久久久久久久 | 强奷人妻日本中文字幕 | 久久精品中文闷骚内射 | 国产电影无码午夜在线播放 | 久久久久成人片免费观看蜜芽 | 久久综合狠狠综合久久综合88 | 国语精品一区二区三区 | 麻豆av传媒蜜桃天美传媒 | 曰本女人与公拘交酡免费视频 | 亚洲人成网站在线播放942 | 99久久亚洲精品无码毛片 | 亚洲中文字幕在线无码一区二区 | 狂野欧美性猛xxxx乱大交 | 国产激情综合五月久久 | ass日本丰满熟妇pics | 国产亚洲人成在线播放 | 亚洲一区二区三区香蕉 | 国产亚洲日韩欧美另类第八页 | 国产成人精品视频ⅴa片软件竹菊 | 波多野42部无码喷潮在线 | 亚洲国产欧美日韩精品一区二区三区 | 精品国偷自产在线 | 国产人妖乱国产精品人妖 | 国精产品一区二区三区 | 大屁股大乳丰满人妻 | 中文无码成人免费视频在线观看 | 日韩少妇内射免费播放 | 成人无码视频在线观看网站 | 国产av无码专区亚洲a∨毛片 | 国产97色在线 | 免 | 亚洲日韩中文字幕在线播放 | 无码av最新清无码专区吞精 | 日本一区二区三区免费播放 | 国产69精品久久久久app下载 | 国产精品-区区久久久狼 | 人人妻人人澡人人爽人人精品 | 红桃av一区二区三区在线无码av | 高中生自慰www网站 | 天堂а√在线中文在线 | 国产农村乱对白刺激视频 | 亚洲区小说区激情区图片区 | 国产97在线 | 亚洲 | 麻豆av传媒蜜桃天美传媒 | 国产成人无码午夜视频在线观看 | 粉嫩少妇内射浓精videos | 中文字幕无码人妻少妇免费 | 高潮毛片无遮挡高清免费视频 | 国内精品人妻无码久久久影院 | 亚洲国产精品美女久久久久 | 亚洲狠狠色丁香婷婷综合 | 亚洲自偷精品视频自拍 | 国产婷婷色一区二区三区在线 | 高潮喷水的毛片 | 欧美精品国产综合久久 | 国产精品理论片在线观看 | 国产乱码精品一品二品 | 在线精品国产一区二区三区 | 国产精品美女久久久久av爽李琼 | 7777奇米四色成人眼影 | 麻豆人妻少妇精品无码专区 | 天堂а√在线中文在线 | 中文字幕无码人妻少妇免费 | 中文字幕人成乱码熟女app | 亚洲中文字幕成人无码 | 国产在线一区二区三区四区五区 | 天天av天天av天天透 | 免费观看的无遮挡av | 亚洲男女内射在线播放 | аⅴ资源天堂资源库在线 | 网友自拍区视频精品 | 精品熟女少妇av免费观看 | 国产成人精品优优av | 漂亮人妻洗澡被公强 日日躁 | 国产亚洲视频中文字幕97精品 | 国产成人精品久久亚洲高清不卡 | 中文字幕日产无线码一区 | 国产热a欧美热a在线视频 | 欧美国产亚洲日韩在线二区 | 欧美成人免费全部网站 | 爆乳一区二区三区无码 | 蜜桃视频插满18在线观看 | 真人与拘做受免费视频 | 内射老妇bbwx0c0ck | 动漫av一区二区在线观看 | 又大又紧又粉嫩18p少妇 | 成年女人永久免费看片 | 激情国产av做激情国产爱 | 国产精品毛片一区二区 | 亚洲天堂2017无码 | 激情五月综合色婷婷一区二区 | 中文字幕 人妻熟女 | 欧美日本免费一区二区三区 | 偷窥村妇洗澡毛毛多 | 亚洲一区二区三区含羞草 | 亚洲人成人无码网www国产 | 国产精品国产三级国产专播 | 无码国产激情在线观看 | 黄网在线观看免费网站 | 无码精品国产va在线观看dvd | 亚洲男人av香蕉爽爽爽爽 | 久久www免费人成人片 | 国产亚洲人成a在线v网站 | 精品国产一区二区三区四区在线看 | 久久久久亚洲精品男人的天堂 | 欧美日韩一区二区综合 | 无码人妻av免费一区二区三区 | 色综合久久中文娱乐网 | 秋霞成人午夜鲁丝一区二区三区 | 国产偷自视频区视频 | 四十如虎的丰满熟妇啪啪 | 亚洲伊人久久精品影院 | 日本爽爽爽爽爽爽在线观看免 | 波多野结衣高清一区二区三区 | 国产又爽又猛又粗的视频a片 | 老司机亚洲精品影院无码 | 精品无人国产偷自产在线 | 国产人妻精品午夜福利免费 | 亚洲国产精品久久人人爱 | 日本大乳高潮视频在线观看 | 国产av无码专区亚洲awww | 人妻aⅴ无码一区二区三区 | 亚洲最大成人网站 | 无码中文字幕色专区 | 国产精品亚洲一区二区三区喷水 | 伊人久久大香线蕉av一区二区 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲国产午夜精品理论片 | 人人妻人人澡人人爽人人精品 | 亚洲中文字幕成人无码 | 午夜理论片yy44880影院 | 精品久久久无码人妻字幂 | 亚洲精品中文字幕久久久久 | 国产午夜无码精品免费看 | 福利一区二区三区视频在线观看 | 亚洲va欧美va天堂v国产综合 | 久久精品国产精品国产精品污 | 欧美日韩一区二区综合 | 撕开奶罩揉吮奶头视频 | 亚洲色偷偷偷综合网 | 欧美性猛交内射兽交老熟妇 | 亚洲色欲色欲欲www在线 | 人妻少妇精品无码专区动漫 | 国产精品无码一区二区三区不卡 | 无码免费一区二区三区 | 特黄特色大片免费播放器图片 | 色婷婷av一区二区三区之红樱桃 | 领导边摸边吃奶边做爽在线观看 | 日本一区二区三区免费高清 | 亚洲人交乣女bbw | 中文无码精品a∨在线观看不卡 | 狠狠色丁香久久婷婷综合五月 | 日日摸日日碰夜夜爽av | 国产精品久久国产精品99 | 丰满少妇高潮惨叫视频 | 午夜免费福利小电影 | 少女韩国电视剧在线观看完整 | 久久精品99久久香蕉国产色戒 | 亚洲一区二区三区含羞草 | 天堂а√在线中文在线 | 97夜夜澡人人双人人人喊 | 色综合久久久无码中文字幕 | 国产成人精品三级麻豆 | 中文字幕av伊人av无码av | 四虎永久在线精品免费网址 | 国产无遮挡吃胸膜奶免费看 | 露脸叫床粗话东北少妇 | 红桃av一区二区三区在线无码av | 国产 浪潮av性色四虎 | 水蜜桃亚洲一二三四在线 | 中文字幕人妻无码一区二区三区 | 波多野结衣av一区二区全免费观看 | 无码毛片视频一区二区本码 | 欧美日本精品一区二区三区 | 亚洲伊人久久精品影院 | 国产精品久久福利网站 | 东京一本一道一二三区 | 国产精品亚洲专区无码不卡 | 无码人妻av免费一区二区三区 | 曰韩少妇内射免费播放 | 国产精品美女久久久 | 成熟女人特级毛片www免费 | www国产精品内射老师 | 亚洲精品一区二区三区在线 | 捆绑白丝粉色jk震动捧喷白浆 | 真人与拘做受免费视频 | 欧美性色19p | 日本熟妇人妻xxxxx人hd | 综合网日日天干夜夜久久 | 98国产精品综合一区二区三区 | 国产人妻精品午夜福利免费 | 精品国产av色一区二区深夜久久 | 亚洲狠狠婷婷综合久久 | 久久精品国产亚洲精品 | 国产综合色产在线精品 | 乱码午夜-极国产极内射 | 一个人看的www免费视频在线观看 | 国产午夜无码精品免费看 | 内射白嫩少妇超碰 | 98国产精品综合一区二区三区 | 国产综合在线观看 | 欧美三级不卡在线观看 | 97精品国产97久久久久久免费 | 亚洲 激情 小说 另类 欧美 | 麻豆国产丝袜白领秘书在线观看 | 国产精品资源一区二区 | 男女猛烈xx00免费视频试看 | 国产精品无码mv在线观看 | 18禁止看的免费污网站 | 激情内射亚州一区二区三区爱妻 | 欧美刺激性大交 | 3d动漫精品啪啪一区二区中 | 少妇性l交大片欧洲热妇乱xxx | 国产亚洲美女精品久久久2020 | 欧美性猛交xxxx富婆 | 久久久久久久久蜜桃 | 永久免费精品精品永久-夜色 | 久久久久久亚洲精品a片成人 | 国产av久久久久精东av | 久久精品成人欧美大片 | 少妇无套内谢久久久久 | 日韩视频 中文字幕 视频一区 | 人人澡人摸人人添 | 国产精品丝袜黑色高跟鞋 | 色综合久久久无码中文字幕 | 色狠狠av一区二区三区 | 亚洲国产日韩a在线播放 | 亚洲国产精品无码久久久久高潮 | √8天堂资源地址中文在线 | 美女扒开屁股让男人桶 | 我要看www免费看插插视频 | 妺妺窝人体色www在线小说 | 色狠狠av一区二区三区 | 大屁股大乳丰满人妻 | a片免费视频在线观看 | 欧美freesex黑人又粗又大 | 欧美日本免费一区二区三区 | 伊在人天堂亚洲香蕉精品区 | 亚洲欧洲日本综合aⅴ在线 | 国产综合久久久久鬼色 | 国产av一区二区精品久久凹凸 | 国产va免费精品观看 | 国产人成高清在线视频99最全资源 | 国产精品无码一区二区三区不卡 | 午夜精品久久久久久久久 | 精品无码国产自产拍在线观看蜜 | 强伦人妻一区二区三区视频18 | 精品国产麻豆免费人成网站 | 国产精品久久久久久久影院 | 三上悠亚人妻中文字幕在线 | 亚洲大尺度无码无码专区 | 亚洲精品成a人在线观看 | 亚洲国产高清在线观看视频 | 国产精品久久久久无码av色戒 | 亚洲熟熟妇xxxx | 狂野欧美性猛交免费视频 | 无码帝国www无码专区色综合 | 未满小14洗澡无码视频网站 | 国产成人精品久久亚洲高清不卡 | 东北女人啪啪对白 | 国产肉丝袜在线观看 | 欧美人与物videos另类 | 国内精品九九久久久精品 | 日韩视频 中文字幕 视频一区 | 亚洲精品国偷拍自产在线麻豆 | 1000部啪啪未满十八勿入下载 | 午夜免费福利小电影 | 骚片av蜜桃精品一区 | 正在播放东北夫妻内射 | 成人性做爰aaa片免费看 | 狠狠色欧美亚洲狠狠色www | 免费人成网站视频在线观看 | 东京热无码av男人的天堂 | 国内精品久久久久久中文字幕 | 5858s亚洲色大成网站www | 国产莉萝无码av在线播放 | 欧美性猛交内射兽交老熟妇 | 精品一区二区三区波多野结衣 | 丰满少妇女裸体bbw | 国产精品第一区揄拍无码 | 久久久久国色av免费观看性色 | 中文字幕人妻丝袜二区 | 亚洲一区二区三区 | 中文字幕精品av一区二区五区 | 亚洲精品www久久久 | 少妇无码一区二区二三区 | 爱做久久久久久 | 2020久久香蕉国产线看观看 | 日本护士xxxxhd少妇 | 国产超碰人人爽人人做人人添 | 国产精品久久久 | 久久人人爽人人人人片 | 亚洲 日韩 欧美 成人 在线观看 | 丁香花在线影院观看在线播放 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 狠狠噜狠狠狠狠丁香五月 | 精品国产av色一区二区深夜久久 | 国产精品久久久久久久9999 | 99久久无码一区人妻 | 天天av天天av天天透 | 天堂亚洲免费视频 | 麻花豆传媒剧国产免费mv在线 | 亚洲精品www久久久 | 一个人看的www免费视频在线观看 | 亚洲精品一区二区三区大桥未久 | 久久久精品456亚洲影院 | 国产精品无码成人午夜电影 | 强开小婷嫩苞又嫩又紧视频 | 久久国产劲爆∧v内射 | 国产成人无码一二三区视频 | 国产综合色产在线精品 | 好屌草这里只有精品 | 伊人久久大香线焦av综合影院 | 成年美女黄网站色大免费全看 | 成人无码视频免费播放 | 伦伦影院午夜理论片 | 欧美高清在线精品一区 | 大乳丰满人妻中文字幕日本 | а√天堂www在线天堂小说 | 国产精品二区一区二区aⅴ污介绍 | 久久午夜无码鲁丝片午夜精品 | 国产av剧情md精品麻豆 | 少妇的肉体aa片免费 | 人人妻人人澡人人爽欧美一区九九 | 少妇被粗大的猛进出69影院 | 欧美激情一区二区三区成人 | 无码吃奶揉捏奶头高潮视频 | 99久久久无码国产精品免费 | 爱做久久久久久 | 亚洲欧美精品伊人久久 | 狂野欧美性猛xxxx乱大交 | 午夜精品一区二区三区的区别 | 亚洲色欲久久久综合网东京热 | 日本一卡二卡不卡视频查询 | 国产精品igao视频网 | 无码人妻少妇伦在线电影 | 精品无人国产偷自产在线 | 精品国产青草久久久久福利 | 亚拍精品一区二区三区探花 | 国产69精品久久久久app下载 | 性色av无码免费一区二区三区 | 午夜福利试看120秒体验区 | 亚洲精品久久久久久一区二区 | 伊人久久大香线蕉av一区二区 | 狂野欧美性猛xxxx乱大交 | 夜精品a片一区二区三区无码白浆 | 国产美女精品一区二区三区 | 麻豆国产97在线 | 欧洲 | 精品乱码久久久久久久 | 丰满少妇熟乱xxxxx视频 | 麻豆国产97在线 | 欧洲 | 国产九九九九九九九a片 | 欧美老人巨大xxxx做受 | 国产精品-区区久久久狼 | 一本大道久久东京热无码av | 成人性做爰aaa片免费看不忠 | 国产凸凹视频一区二区 | 国产真实夫妇视频 | 亚洲日韩av一区二区三区四区 | 欧美精品无码一区二区三区 | 久久综合九色综合欧美狠狠 | av人摸人人人澡人人超碰下载 | 亚洲七七久久桃花影院 | 国产无套内射久久久国产 | 色综合久久久久综合一本到桃花网 | 99久久亚洲精品无码毛片 | 国产乱人伦av在线无码 | 欧美国产日产一区二区 | 亚洲精品国产a久久久久久 | 中文字幕+乱码+中文字幕一区 | 狠狠躁日日躁夜夜躁2020 | 青青草原综合久久大伊人精品 | 国产激情无码一区二区app | 国产尤物精品视频 | 一本久道久久综合狠狠爱 | 免费观看激色视频网站 | 女高中生第一次破苞av | 亚洲人交乣女bbw | 嫩b人妻精品一区二区三区 | 国产亚洲欧美日韩亚洲中文色 | 亚洲成a人片在线观看无码 | 中文字幕无码免费久久9一区9 | 欧美日韩色另类综合 | 亚洲成a人一区二区三区 | 亚洲精品www久久久 | 亚洲日韩一区二区 | 无人区乱码一区二区三区 | 亚洲国产日韩a在线播放 | 中文字幕无码人妻少妇免费 | 人人妻人人澡人人爽人人精品 | 亚洲一区二区三区含羞草 | 亚洲精品国产第一综合99久久 | 日本一区二区三区免费播放 | 性色欲网站人妻丰满中文久久不卡 | 99久久无码一区人妻 | 久久综合给合久久狠狠狠97色 | 2020久久香蕉国产线看观看 | 日产精品99久久久久久 | 亚洲人成网站色7799 | 波多野42部无码喷潮在线 | 久久午夜夜伦鲁鲁片无码免费 | 欧美三级a做爰在线观看 | 正在播放东北夫妻内射 | 国产乱人无码伦av在线a | 377p欧洲日本亚洲大胆 | 国产亚洲视频中文字幕97精品 | 婷婷色婷婷开心五月四房播播 | 欧美亚洲日韩国产人成在线播放 | 亚洲人成无码网www | 草草网站影院白丝内射 | 日本精品久久久久中文字幕 | 国产激情一区二区三区 | 中文字幕乱妇无码av在线 | 99久久精品无码一区二区毛片 | 日欧一片内射va在线影院 | 77777熟女视频在线观看 а天堂中文在线官网 | 欧美一区二区三区 | 99精品无人区乱码1区2区3区 | 国产又爽又黄又刺激的视频 | 国产9 9在线 | 中文 | 亚拍精品一区二区三区探花 | 精品无码国产自产拍在线观看蜜 | 免费无码的av片在线观看 | 国产一区二区三区日韩精品 | 香港三级日本三级妇三级 | 中文字幕av日韩精品一区二区 | 色综合久久久无码网中文 | 麻豆人妻少妇精品无码专区 | 国产精品爱久久久久久久 | 4hu四虎永久在线观看 | 狠狠噜狠狠狠狠丁香五月 | 77777熟女视频在线观看 а天堂中文在线官网 | 色一情一乱一伦一区二区三欧美 | 偷窥村妇洗澡毛毛多 | 亚洲综合精品香蕉久久网 | 九九在线中文字幕无码 | 亚洲日韩av片在线观看 | 亚洲国产精品毛片av不卡在线 | 图片小说视频一区二区 | 国产亚洲视频中文字幕97精品 | 午夜福利一区二区三区在线观看 | 亚洲精品一区二区三区在线观看 | 国产三级久久久精品麻豆三级 | 牲欲强的熟妇农村老妇女视频 | av人摸人人人澡人人超碰下载 | 人人超人人超碰超国产 | 亚洲国产成人a精品不卡在线 | 久久久久久九九精品久 | 亚洲一区二区三区无码久久 | 国产精品99久久精品爆乳 | 美女极度色诱视频国产 | 无码一区二区三区在线观看 | 色婷婷香蕉在线一区二区 | 免费看男女做好爽好硬视频 | 成人一区二区免费视频 | 人妻aⅴ无码一区二区三区 | 在线播放免费人成毛片乱码 | 精品欧洲av无码一区二区三区 | 久久人人爽人人爽人人片ⅴ | 久久精品国产99久久6动漫 | 牲欲强的熟妇农村老妇女 | 日韩人妻系列无码专区 | 性欧美大战久久久久久久 | 国产后入清纯学生妹 | 久久99久久99精品中文字幕 | 亚洲成a人片在线观看无码 | 水蜜桃亚洲一二三四在线 | 熟妇人妻无码xxx视频 | 男女爱爱好爽视频免费看 | 久久国产精品偷任你爽任你 | 天天av天天av天天透 | 人人妻人人藻人人爽欧美一区 | 久久久中文久久久无码 | 国产精品人人爽人人做我的可爱 | 一本久道久久综合婷婷五月 |