open

OPEN(2)                          System calls                          OPEN(2)



NAME
       open, creat - ç¨ä¾ æéååµå»º ä¸å æ件æè¨å

SYNOPSIS 總覽
       #includ e <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode)
       int creat(const char *pathname, mode_t mode);

æè¿° (DESCRIPTION)
       open() é常ç¨æ¼å°è·¯å¾åè½æç²ä¸åæ件æ述符ï¼ä¸åéè² çå°æ´æ¸ï¼å¨ read  ,
       write ç I/O æä½ä¸å°æ被使ç¨ï¼ãç¶ open()
       調ç¨æåï¼å®æè¿åä¸åæ°çæ件æ述符ï¼æ°¸é åæªç¨æ述符çæå°å¼ï¼ã
       éå調ç¨åµå»ºä¸åæ°çæéæ件ï¼å³åéä¸åæ°çç¨ä¸ç¡ äºçæ件æ述符ï¼ä¸æèéè¡ä¸‐
       çä»»ä½å¶ä»ç¨åºå±äº«ï¼ä½å¯ä»¥éé fork (2) 系統調ç¨å¯¦ç¾å±äº«ï¼ã
       éåæ°çæ件æ述符å¨å¶å¾å°æéæ件æä½çå½æ¸ä¸ä½¿ç¨ï¼åè fcntl(2)
       ï¼æ件çè®å¯«æé被置æ¼æ件é

       åæ¸ flags æ¯éé O_RDONLY, O_WRONLY æ O_RDWR (ææ æ件 æ¯ä»¥ åªè® , åªå¯«
       æ è®å¯« æ¹å¼ æéç) è ä¸é¢ç é¶å æ å¤å å¯é¸æ¨¡å¼ æä½ -or æä½ å¾å°ç:

       O_CREAT
              è¥æ件 ä¸åå¨ å° åµå»º ä¸å æ° æ件.  æ° æ件 ç 屬主 (ç¨æ¶ID)
              被 è¨ç½® ç² æ¤ ç¨åº ç ææ ç¨æ¶ ç ID.  å樣 æ件 æ屬 åçµ ä¹ è¢«
              è¨ç½® ç² æ¤ ç¨åº ç ææ åçµ ç ID æè ä¸å±¤ ç®é ç åçµ ID (é ä¾è³´
              æ件系統 é¡å ,è£è¼é¸é  å ä¸å±¤ç®é ç 模å¼, åè,å¨ mount(8) ä¸
              æè¿° ç ext2 æ件系統 ç è£è¼é¸é  bsdgroups å sysvgroups )

       O_EXCL éé O_CREAT, çæ æ件 , è¥ æ件 å·²ç¶ åå¨ , å open åºé¯ , 調ç¨
              失æ . è¥æ¯ åå¨ ç¬¦èè¯æ¥ , å°æ æ å®ç è¯æ¥æé ç æå æ件 忽ç¥.
              O_EXCL is broken on NFS file systems, programs which rely on it
              for performing locking tasks will contain a race condition.  The
              solution for performing atomic file locking using a lockfile is
              to create a unique file on the same fs (e.g., incorporating
              hostname and pid), use link(2) to make a link to the lockfile.
              If link() returns 0, the lock is successful.  Otherwise, use
              stat(2) on the unique file to check if its link count has
              increased to 2, in which case the lock is also successful.

       O_NOCTTY
              åå¦ pathname å¼ç¨ ä¸å çµç«¯è¨å — åè tty(4) — å³ä½¿ é²ç¨ æ²æ
              æ§å¶çµç«¯ ,éå çµç«¯ ä¹ ä¸æ è®æ é²ç¨ ç æ§å¶ çµç«¯.

       O_TRUNC
              åå¦ æ件 å·²ç¶ åå¨ , ä¸æ¯ ä¸å æ®é æ件 ,æé æ¨¡å¼ åæ¯ å¯å¯«(å³
              æ件 æ¯ ç¨ O_RDWR æ O_WRONLY æ¨¡å¼ æé ç) , å°±æ æ件 ç é·åº¦ è¨‐
              ç½® ç² é¶ , ä¸æ£ å¶ä¸ ç ç¾æ å§å®¹.è¥ æ件 æ¯ ä¸å FIFO æ çµç«¯è¨å
              æ件 , O_TRUNC æ¨èª 被 忽ç¥.  å¶ä» O_TRUNC ç ä½ç¨ æ¯ ä¸ å·é«
              æå® ç (å¨ è¨±å¤ Linux çæ¬ ä¸ , é常 æ 被 å¿½ç¥ , å¶ä» ç ä¸äº
              çæ¬ å° è¿å ä¸å é¯èª¤)

       O_APPEND
              æ件 以 è¿½å  æ¨¡å¼ æé . å¨ å¯« 以å , æ件 è®å¯« æé 被 ç½® å¨
              æ件 ç æ«å°¾ .  as if with lseek.  O_APPEND may lead to
              corrupted files on NFS file systems if more than one process
              appends data to a file at once.  This is because NFS does not
              support appending to a file, so the client kernel has to
              simulate it, which can't be done without a race condition.

       O_NONBLOCK æ O_NDELAY
              æé(open) æ件 å¯ä»¥ 以 éå¡(non-blocking) æ¨¡å¼ æé . æ¤æ æ件
              並 æ²æ æé , ä¹ ä¸è½ ä½¿ç¨ è¿å ç æ件æ述符 é²è¡ å¾çº æä½ , èæ¯
              使 èª¿ç¨ ç¨åº çå¾ . æ¤ æ¨¡å¼ æ¯ ç²äº FIFO (å½å管é) ç èç , åè
              fifo(4).  é種 æ¨¡å¼ å° é¤äº FIFO å¤ æ²æ ä»»ä½ å½±é¿ .

       O_SYNC æé æ件 å¯¦ç¾ I/O ç åæ¥ . ä»»ä½ éé æ件æ述符 å° æ件 ç write
              é½æ 使 èª¿ç¨ ç é²ç¨ ä¸æ· , ç´å° æ¸æ 被 çæ£ å¯«å¥ ç¡¬ä»¶ ä¸ .
              å¶ä» , åè RESTRICTIONS.

       O_NOFOLLOW
              åå¦ pathname æ¯ ä¸å 符è è¯æ¥ , å æé 失æ . éæ¯ FreeBSD ç æ´å ,
              å¾ 2.1.126 çæ¬ ä»¥ä¾ è¢« å¼å¥ å° Linux ä¸ä¾ .  å¾ glibc2.0.100
              庫 ä»¥ä¾ , é æ件 ä¸ åæ¬ äº éå åæ¸ ç å®ç¾©;
                kernel 2.1.126 以å å° å¿½ç¥ å®ç 使ç¨.

       O_DIRECTORY
              åå¦ pathname ä¸æ¯ ç®é , æé å°± 失æ . éå åæ¸ æ¯ Linux ç¹æ ç , å¨
              kernel 2.1.126 ä¸ å å¥ , ç²äº é¿å å¨ èª¿ç¨ FIFO æ ç£å¸¶è¨å æ ç
              denial-of-service åé¡ , ä½æ¯ ä¸æ該 å¨ å·è¡ opendir ä»¥å¤ ä½¿ç¨.

       O_LARGEFILE
              å¨ 32ä½ ç³»çµ± ä¸ æ¯æ 大 æ件系統 , å許 æé é£äº ç¨ 31ä½ é½
              ä¸è½ 表示 å¶ é·åº¦ ç 大 æ件 .

       å¨ æ件 æé å¾ , éäº å¯é¸ åæ¸ å¯ä»¥ éé fcntl ä¾ æ¹è® .

       å¨ æ°æ件 被 åµå»º æ , åæ¸ mode å·é« ææ äº ä½¿ç¨ æ¬é . ä» é常 ä¹ æ
       被 umask ä¿®æ¹ . æ以 ä¸è¬ æ°å»º æ件 ç æ¬é ç² (mode & ~umask).  注æ
       æ¨¡å¼ åª è¢« æç¨ æ¼ å°ä¾ å° é æ°æ件 ç ä½¿ç¨ ä¸; open èª¿ç¨ åµå»º ä¸å
       æ°ç åªè® æ件 , ä½ ä» å° è¿å ä¸å å¯ è®å¯« æ件 æ述符.

       å¾é¢ æ¯ ä¸äº mode ç å·é« åæ¸:

       S_IRWXU
              00700 å許 æ件 ç 屬主 è® , 寫 å å·è¡ æ件

       S_IRUSR (S_IREAD)
              00400 å許 æ件 ç 屬主 è® æ件

       S_IWUSR (S_IWRITE)
              00200 å許 æ件 ç 屬主 寫 æ件

       S_IXUSR (S_IEXEC)
              00100 å許 æ件 ç 屬主 å·è¡ æ件

       S_IRWXG
              00070 å許 æ件 æå¨ ç åçµ è® , 寫 å å·è¡ æ件

       S_IRGRP
              00040 å許 æ件 æå¨ ç åçµ è® æ件

       S_IWGRP
              00020 å許 æ件 æå¨ ç åçµ å¯« æ件

       S_IXGRP
              00010 å許 æ件 æå¨ ç åçµ å·è¡ æ件

       S_IRWXO
              00007 å許 å¶ä» ç¨æ¶ è® , 寫 å å·è¡ æ件

       S_IROTH
              00004 å許 å¶ä» ç¨æ¶ è® æ件

       S_IWOTH
              00002 å許 å¶ä» ç¨æ¶ 寫 æ件

       S_IXOTH
              00001 å許 å¶ä» ç¨æ¶ å·è¡ æ件

       mode åªæ ç¶ å¨ flags ä¸ ä½¿ç¨ O_CREAT æ æ ææ , å¦å 被 忽ç¥.

       creat ç¸ç¶ æ¼ open ç åæ¸ flags çæ¼ O_CREAT|O_WRONLY|O_TRUNC.

RETURN VALUE è¿åå¼
       open å creat é½ è¿å ä¸å æ°ç æ件æ述符 (è¥æ¯ æ é¯èª¤ ç¼ç è¿å -1 ,並å¨
       errno è¨ç½® é¯èª¤ ä¿¡æ¯).  注æ open å¯ä»¥ æé è¨å å°ç¨ æ件 , ä½æ¯
       creat ä¸è½åµå»º,éè¦ç¨ mknod(2) ä¾ä»£æ¿.

       On NFS file systems with UID mapping enabled, open may return a file
       descriptor but e.g. read(2) requests are denied with EACCES.  This is
       because the client performs open by checking the permissions, but UID
       mapping is performed by the server upon read and write requests.

       è¥ æ件 æ¯ æ° å»ºç« ç , ä» ç atime(ä¸æ¬¡è¨ªåæé), ctime(åµå»ºæé),
       mtime(ä¿®æ¹æé) é½ è¢« ä¿®æ¹ ç² ç¶å æé , ä¸å±¤ ç®é çatime , ctime ä¹ è¢«
       å樣 ä¿®æ¹ . å¶ä»ç , åå¦ æ件 æ¯ ç± O_TRUNC åæ¸ ä¿®æ¹ ç ,å®ç ctime ,
       mtime å ä¹ è¢« è¨ç½® ç² ç¶å æé.


ERRORS é¯èª¤ä¿¡æ¯
       EEXIST åæ¸ O_CREAT and O_EXCL 被 使ç¨,ä½æ¯æ件( pathname )å·²ç¶åå¨.

       EISDIR æ件å ( pathname ) æ¯ ä¸å ç®é , è å æ¶å å° å¯« æä½.

       EACCES
               訪å è«æ± ä¸ å許 (æ¬éä¸å¤ ) , å¨ æ件å ( pathname )ä¸ æ ä¸ ç®é
              ä¸å許 æç´¢ (æ²æ å·è¡æ¬é) , æè æ件 é ä¸åå¨ ä¸ å° ä¸å±¤ç®é ç 寫
              æä½ å ä¸å許.

       ENAMETOOLONG
              æ件å ( pathname ) 太 é· äº

       ENOENT ç®é ( pathname ) ä¸åå¨ æè æ¯ ä¸å æ¸ç©º ç 符è è¯æ¥.

       ENOTDIR
              pathname ä¸æ¯ ä¸å åç®é

       ENXIO  ä½¿ç¨ O_NONBLOCK | O_WRONLY, å½å ç æ件 æ¯ FIFO , æè® æ件 é æ²æ
              æé ç æ件 , æè , æé ä¸å è¨å å°ç¨ æ件 è ç¸æ ç è¨å ä¸åå¨

       ENODEV æ件 ( pathname ) å¼ç¨ äº ä¸å è¨å å°ç¨ æ件 , è ç¸æ ç è¨å å ä¸å‐
              å¨.  (éæ¯ linux kernel ç ä¸åbug - ENXIO ä¸å® æ 被 è¿å .)

       EROFS  æ件 ( pathname ) æ¯ä¸ååªè®æ件ï¼åæ寫æä½è¢«è«æ±ã

       ETXTBSY
              æ件 ( pathname ) æ¯ä¸åæ£å¨è¢«å·è¡çå¯å·è¡æ件ï¼åæ寫æä½è¢«è«æ±ã

       EFAULT pathname å¨ä¸åä½ ä¸è½è¨ªåçå°å空é.

       ELOOP  å¨ å解 pathname æ , éå° å¤ªå¤ ç¬¦èè¯æ¥ æè ææ O_NOFOLLOW ä½æ¯
              pathname æ¯ ä¸å 符èè¯æ¥

       ENOSPC pathname å°è¦è¢«åµå»º,ä½æ¯è¨ååæ²æ空éå²å pathname æ件äº

       ENOMEM å¯ ç²å¾ ç æ ¸å¿å§å(kernel memory) ä¸å¤

       EMFILE ç¨åºæéçæ件æ¸å·²ç¶éå°æ大å¼äº

       ENFILE 系統æéç總æ件æ¸å·²ç¶éå°äºæ¥µé

CONFORMING TO
       SVr4, SVID, POSIX, X/OPEN, BSD 4.3 The O_NOFOLLOW and O_DIRECTORY flags
       are Linux-specific.  One may have to define the _GNU_SOURCE macro to
       get their definitions.

RESTRICTIONS ç¡éå¶
       There are many infelicities in the protocol underlying NFS, affecting
       amongst others O_SYNC and O_NDELAY.

       POSIX provides for three different variants of synchronised I/O,
       corresponding to the flags O_SYNC, O_DSYNC and O_RSYNC.  Currently
       (2.1.130) these are all synonymous under Linux.

SEE ALSO åè¦
       read(2), write(2), fcntl(2), close(2), link(2), mknod(2), mount(2),
       stat(2), umask(2), unlink(2), socket(2), fopen(3), fifo(4)


[ä¸æçç¶è·äºº]
       Daniel <badlong@163.com>

[ä¸æçææ°æ´æ°]
       2002/01/10

ãä¸ålinuxè«å£manæåé ç¿»è¯è¨åã:
       http://cmpp.linuxforum.net

è·
       æ¬é é¢ä¸æçç±ä¸æ man æåé è¨åæä¾ã
       ä¸æ man æåé è¨åï¼https://github.com/man-pages-zh/manpages-zh



Linux                             1999-06-03                           OPEN(2)