Aprende o comando Linux Open

Sinopse

#include << A HREF = "file: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "file: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "file: /usr/include/fcntl.h"> fcntl.h> int abrir (const char * pathname , int flags ); int abrir (const char * pathname , int flags , mode_t mode ); int creat (const char * pathname, modo_t );

Descrición

A orde open () chamada linux command úsase para converter un nome de ruta nun descriptor de ficheiro (un enteiro pequeno non negativo para o seu uso nas seguintes E / S como con lectura , escritura , etc.). Cando a chamada é exitosa, o descriptor de ficheiro volve ser o descritor de ficheiro máis baixo que non está aberto para o proceso. Esta chamada crea un novo ficheiro aberto, non compartido con ningún outro proceso. (Os ficheiros abertos compartidos poden xurdir a través da chamada do sistema fork (2)). O novo descriptor de ficheiro está configurado para permanecer aberto nas funcións de exec (ver fcntl (2)). O desprazamento de ficheiro está configurado no inicio do ficheiro.

As bandeiras de parámetros son un dos O_RDONLY , O_WRONLY ou O_RDWR que solicitan abrir o ficheiro só de lectura, só de escritura ou le / escritura, respectivamente, bitwise- ou 'd con cero ou máis dos seguintes:

O_CREAT

Se o ficheiro non existe, será creado. O propietario (ID de usuario) do ficheiro está configurado no ID de usuario efectivo do proceso. A propiedade do grupo (ID do grupo) está definida para o ID do grupo efectivo do proceso ou para o ID do grupo do cartafol primario (dependendo do tipo de sistema de ficheiros e das opcións de montaxe e do modo do cartafol primario, consulte, por exemplo, o monte opcións bsdgroups e sysvgroups do sistema de ficheiros ext2, como se describe no mount (8)).

O_EXCL

Cando se usa con O_CREAT , se o ficheiro xa existe, é un erro e o aberto fallará. Neste contexto, existe unha ligazón simbólica, independentemente de onde se atope. O_EXCL está roto en sistemas de ficheiros NFS , os programas que dependen deles para realizar tarefas de bloqueo conterán unha condición de carreiras. A solución para executar o bloqueo de arquivos atómicos usando un ficheiro de bloqueo é crear un ficheiro único no mesmo fs (por exemplo, incorporar o nome do servidor e o pid), use a ligazón (2) para facer unha ligazón ao ficheiro de bloqueo. Se a ligazón () devolve 0, o bloqueo é exitoso. En caso contrario, usa a estatística (2) no ficheiro único para comprobar se o seu reconto de ligazón aumentou a 2, caso en que o bloqueo tamén é exitoso.

O_NOCTTY

Se o nome da ruta refírese a un dispositivo de terminal --- vexa tty (4) --- non se converterá no terminal de control do proceso aínda que o proceso non teña un.

O_TRUNC

Se o ficheiro xa existe e é un ficheiro normal eo modo aberto permite escribir (isto é, é O_RDWR ou O_WRONLY) truncarase ata a lonxitude 0. Se o ficheiro é FIFO ou un ficheiro de dispositivo terminal, ignórase a bandeira O_TRUNC. Se non, o efecto de O_TRUNC non está especificado. (En moitas versións Linux ignoraranse; noutras versións, devolverá un erro).

O_APPEND

O ficheiro está aberto no modo anexo. Antes de cada escritura , o punteiro do ficheiro sitúase ao final do ficheiro, coma se fose Lseek . O_APPEND pode levar a ficheiros corrompidos nos sistemas de ficheiros NFS se máis dun proceso engade datos a un ficheiro á vez. Isto débese a que NFS non admite a súa adición a un ficheiro, polo que o kernel do cliente ten que simularlo, o que non se pode facer sen condición de raza.

O_NONBLOCK ou O_NDELAY

Cando sexa posible, o ficheiro está aberto en modo non bloqueo. Nin as operacións abertas nin as posteriores no descriptor de ficheiro que se devolven farán que o proceso de chamada espere. Para o manexo de FIFOs (canles nomeadas), vexa tamén o fifo (4). Este modo non ten ningún efecto sobre ficheiros distintos de FIFOs.

O_SYNC

O ficheiro está aberto para I / O síncrono. Calquera escritura no descriptor de ficheiro resultante bloqueará o proceso de chamada ata que os datos fosen escritos físicamente no hardware subxacente. Vexa RESTRICTIONS a continuación.

O_NOFOLLOW

Se a ruta é unha ligazón simbólica, entón a falla aberta. Esta é unha extensión de FreeBSD, que foi engadido a Linux na versión 2.1.126. As ligazóns simbólicas nos compoñentes anteriores da ruta aínda seguirán. Os encabezados de glibc 2.0.100 e posteriores inclúen unha definición desta bandeira; Os kernel antes de 2.1.126 ignoraranos se se usan .

O_DIRECTORY

Se o nome do camiño non é un directorio, falla o aberto. Esta bandeira é específica de Linux e foi engadida na versión 2.1.126 do kernel, para evitar problemas de denegación de servizo se se chama opendir (3) nun dispositivo FIFO ou cinta, pero non se debe usar fóra da implementación de opendir .

O_DIRECT

Tenta minimizar os efectos da caché das E / S a partir deste ficheiro. En xeral, isto degradará o rendemento, pero é útil en situacións especiais, como cando as aplicacións realizan a súa propia caché. O ficheiro I / O faise directamente a / desde os buffers de espazo de usuario. As E / S son síncronas, é dicir, ao completar a chamada do sistema de lectura (2) ou de escritura (2), os datos están garantidos para seren transferidos. Os tamaños de transferencia e o aliñamento do buffer do usuario e do desprazamento de ficheiros deben ser múltiplos do tamaño do bloque lóxico do sistema de ficheiros.
Esta bandeira é compatible con varios sistemas parecidos a Unix; O soporte foi engadido baixo Linux no kernel versión 2.4.10.
Unha interface semánticamente similar para dispositivos de bloque descríbese en bruto (8).

O_ASYNC

Xerar un sinal (SIGIO por defecto, pero iso pódese cambiar a través de fcntl (2)) cando a entrada ou a saída son posibles neste descriptor de ficheiro. Esta función só está dispoñible para terminales, pseudo-terminales e sockets. Vexa fcntl (2) para máis detalles.

O_LARGEFILE

Nos sistemas de 32 bits que soportan o Sistema de ficheiros grandes, permiten abrir ficheiros cuxos tamaños non se poden representar en 31 bits.

Algunhas destas bandeiras opcionais poden ser modificadas usando fcntl despois de que o ficheiro estea aberto.

O modo de argumento especifica os permisos para usar no caso de que se cre un novo ficheiro. É modificado polo umask do proceso de xeito habitual: os permisos do ficheiro creado son (modo & ~ umask) . Lembre que este modo só se aplica aos accesos futuros do ficheiro recentemente creado; a chamada aberta que crea un ficheiro de só lectura pode moi ben devolver un descriptor de ficheiro de lectura / escritura.

As seguintes constantes simbólicas son fornecidas para o modo :

S_IRWXU

O usuario 00700 (propietario do ficheiro) leu, escribiu e executaba permiso

S_IRUSR (S_IREAD)

O usuario de 00400 ten permiso de lectura

S_IWUSR (S_IWRITE)

O usuario de 00200 ten permiso de escritura

S_IXUSR (S_IEXEC)

O usuario de 00100 ten permiso de execución

S_IRWXG

O grupo 00070 leu, escribiu e executou o permiso

S_IRGRP

O grupo 00040 ten permiso de lectura

S_IWGRP

O grupo 00020 ten permiso de escritura

S_IXGRP

O grupo 00010 ten permiso de execución

S_IRWXO

Outros 00007 leron, escribiron e executaron o permiso

S_IROTH

Outros 00004 teñen permiso de lectura

S_IWOTH

Outros 00002 teñen permiso de escritura

S_IXOTH

Outros 00001 teñen permiso de execución

O modo debe ser especificado cando O_CREAT está nas bandeiras e ignórase o contrario.

O creado equivale a abrir con bandeiras iguais a O_CREAT | O_WRONLY | O_TRUNC .

VALOR DEVOLUCIÓN

abra e crea regresar o novo descriptor de ficheiro, ou -1 se se produciu un erro (nese caso, errno configúrase de forma adecuada). Teña en conta que abrir pode abrir ficheiros especiais do dispositivo, pero creat non pode crealos - use mknod (2) no seu lugar.

Nos sistemas de ficheiros NFS con mapeamento UID habilitado, aberto pode devolver un descriptor de ficheiro, por exemplo, se se rexeitan as solicitudes de lectura (2) con EACCES . Isto ocorre porque o cliente realiza a apertura mediante a comprobación dos permisos, pero o servidor realiza o mapeamento de UID ao ler e escribir as solicitudes.

Se o ficheiro está recén criado, os seus campos atime, ctime, mtime están axustados á hora actual e así o son os campos ctime e mtime do directorio primario. Se non, se o ficheiro se modifica debido á marca O_TRUNC, os seus campos ctime e mtime están axustados á hora actual.

Erros

EEXIST

O nome da ruta xa existe e usáronse O_CREAT e O_EXCL .

EISDIR

O nome do camiño refírese a un directorio e o acceso requirido escrito (isto é, O_WRONLY ou O_RDWR está configurado).

EACCES

O acceso solicitado ao ficheiro non está permitido, ou un dos directorios do nome da ruta non permitía o permiso de busca (execute) ou o ficheiro aínda non existía e non se permite o acceso ao directorio primario.

ENAMETOOLONG

O nome da ruta era demasiado longo.

ENOENT

O_CREAT non está configurado eo ficheiro nomeado non existe. Ou, un compoñente de directorio no nome da ruta non existe ou é unha ligazón simbólica colgante.

ENOTDIR

Un compoñente empregado como directorio no nome da ruta non é, de feito, un directorio ou O_DIRECTORY especificouse eo nome da ruta non era un directorio.

ENXIO

O_NONBLOCK | O_WRONLY está configurado, o ficheiro nomeado é FIFO e ningún proceso ten o ficheiro aberto para ler. Ou, o ficheiro é un ficheiro de dispositivo especial e non existe ningún dispositivo correspondente.

ENODEV

O nome da ruta refírese a un ficheiro especial do dispositivo e non existe un dispositivo correspondente. (Este é un erro de kernel de Linux; nesta situación ENXIO debe devolto.)

EROFS

O nome da ruta refírese a un ficheiro nun sistema de ficheiros de só lectura e solicitouse o acceso á escrita.

ETXTBSY

O nome da ruta refírese a unha imaxe executable que se está a executar e que se solicitou o acceso á escrita.

EFAULT

Os puntos de ruta de acceso están fóra do seu espazo de enderezo accesible.

ELOOP

Atopáronse demasiadas ligazóns simbólicas na resolución do nome da ruta , ou se especificou O_NOFOLLOW pero a ruta era unha ligazón simbólica.

ENOSPC

Creouse o nome da ruta pero o dispositivo que contén o nome da ruta non ten espazo para o novo ficheiro.

ENOMEM

Non se atopou memoria de kernel insuficiente.

EMFILE

O proceso xa ten o número máximo de ficheiros abertos.

ENFILO

Fixouse o límite no número total de ficheiros abertos no sistema.

Conforme a

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 As bandeiras O_NOFOLLOW e O_DIRECTORY son Linux específicas. Pódese ter que definir a macro _GNU_SOURCE para obter as súas definicións.

Restricións

Hai moitas infelicidades no protocolo subxacente a NFS, que afecta entre outras O_SYNC e O_NDELAY .

POSIX fornece tres variantes de I / O sincronizadas, correspondentes ás bandeiras O_SYNC , O_DSYNC e O_RSYNC . Actualmente (2.1.130) estes están todos baixo Linux.