Linux Komutunu Açık Öğrenin

özet

#include << A HREF = "dosya: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "dosya: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "dosya: /usr/include/fcntl.h"> fcntl.h> int açık (const char * yol adı , int bayrakları ); int açık (const char * yol adı , int bayrakları , mode_t modu ); int creat (const char * yol adı , mode_t modu );

Açıklama

Open () sistem çağrısı linux komutu , bir yol adını bir dosya tanıtıcısına ( okuma , yazma vb. Gibi sonraki G / Ç'de kullanılmak üzere küçük, negatif olmayan bir tamsayıya) dönüştürmek için kullanılır. Çağrı başarılı olduğunda, dosya tanıtıcı döndürüldü, şu anda işlem için açık olmayan en düşük dosya tanıtıcısı olacaktır. Bu çağrı, başka bir işlemle paylaşılmayan yeni bir açık dosya oluşturur. (Ancak paylaşılan açık dosyalar çatal (2) sistem çağrısı ile ortaya çıkabilir.) Yeni dosya tanıtıcısı, exec işlevlerinde açık kalacak şekilde ayarlanmıştır (bkz. Fcntl (2)). Dosya ofseti dosyanın başlangıcına ayarlanır.

Parametre bayrakları O_RDONLY , O_WRONLY veya O_RDWR dosyalarından biridir, bunlar salt okunur, salt okunur veya read / write, sırasıyla, bitwise- veya 'd ile aşağıdakilerin sıfırını veya daha fazlasını açar:

O_CREAT

Dosya mevcut değilse, oluşturulacaktır. Dosyanın sahibi (kullanıcı kimliği), sürecin etkili kullanıcı kimliğine ayarlanır. Grup sahipliği (grup kimliği), sürecin etkili grup kimliğine veya üst dizinin grup kimliğine (dosya sistemi türüne ve bağlama seçeneklerine ve üst dizinin moduna bağlı olarak ayarlanır; bkz. mount (8) 'de açıklandığı gibi ext2 dosya sisteminin bsdgroups ve sysvgroups seçeneklerini içerir .

O_EXCL

O_CREAT ile kullanıldığında, dosya zaten mevcutsa, bir hatadır ve açma işlemi başarısız olur. Bu bağlamda, noktalarının nerede olduğuna bakılmaksızın sembolik bir bağ vardır. O_EXCL , NFS dosya sistemlerinde bozulur, kilitleme görevlerini yerine getirmek için ona güvenen programlar bir yarış durumu içerecektir. Bir kilit dosyası kullanarak atomik dosya kilitleme işlemi için çözüm aynı fs (örneğin, ana bilgisayar adı ve pid dahil) üzerinde benzersiz bir dosya oluşturmak için, kilit dosyasına bir bağlantı yapmak için bağlantı (2) kullanın. Link () 0 değerini döndürürse, kilit başarılı olur. Aksi takdirde, bağlantı sayısı 2'ye yükseltilmiş olup olmadığını kontrol etmek için benzersiz dosyadaki stat (2) 'yi kullanın, bu durumda kilit de başarılı olur.

O_NOCTTY

Eğer yol adı bir terminal cihazına başvurursa --- tty'ye bakın (4) --- eğer prosesin bir tane olmasa bile prosesin kontrol terminali olmayacaktır.

O_TRUNC

Dosya zaten mevcutsa ve normal bir dosyaysa ve açık mod yazmaya izin verirse (yani O_RDWR veya O_WRONLY), 0 uzunluğuna kesilecektir. Dosya bir FIFO veya terminal aygıtı dosyasıysa, O_TRUNC bayrağı yoksayılır. Aksi halde, O_TRUNC etkisi belirtilmemiş. (Birçok Linux sürümünde yoksayılacak, diğer sürümlerde bir hata döndürecektir.)

olmaması için O_APPEND

Dosya ek modda açılır. Her yazma işleminden önce, dosya işaretçisi lseek ile sanki dosyanın sonuna yerleştirilir. Birden fazla işlem bir kerede bir dosyaya veri eklediğinde O_APPEND , NFS dosya sistemlerinde bozuk dosyalara yol açabilir. Bunun nedeni, NFS'nin bir dosyaya eklenmeyi desteklememesidir, bu nedenle istemci çekirdeğinin simülasyonunu yapmak zorundadır, bu da bir yarış durumu olmadan gerçekleştirilemez.

O_NONBLOCK veya O_NDELAY

Mümkün olduğunda, dosya engelleme olmayan modda açılır. Ne açık ne de iade edilen dosya tanıtıcıdaki sonraki işlemler, çağrı sürecinin beklemesine neden olmaz. FIFO'ların (adlandırılmış borular) kullanımı için fifo'ya da bakınız (4). Bu modun FIFO'lardan başka dosyalarda herhangi bir etkisi yoktur.

O_SYNC

Dosya senkronize G / Ç için açılır. Ortaya çıkan dosya tanımlayıcısındaki herhangi bir yazma , veri fiziksel olarak temel donanıma yazılana kadar çağrı işlemini engelleyecektir. Yine de, aşağıdaki RESTRICTIONS bakın.

O_NOFOLLOW

Yol adı sembolik bir bağlantı ise, açık başarısız olur. Bu, 2.1.126 sürümüne Linux'a eklenen bir FreeBSD uzantısıdır. Yol adının önceki bileşenlerinde sembolik bağlantılar hala izlenecektir. Glibc 2.0.100 ve üstü başlıklar bu bayrağın bir tanımını içerir; 2.1.126'dan önceki çekirdekler kullanıldığında göz ardı edilir .

O_DIRECTORY

Yol adı bir dizin değilse, açıklığın başarısız olmasına neden olun. Bu bayrak Linux'a özgüdür ve çekirdeğin 2.1.126 sürümüne eklenmiştir, eğer bir FIFO veya teyp aygıtında opendir (3) çağrılırsa hizmet reddi sorunlarından kaçınılmalı, ancak opendir uygulamasının dışında kullanılmamalıdır. .

O_DIRECT

G / Ç'nin önbellek etkilerini bu dosyaya ve bu dosyadan en aza indirmeye çalışın. Genel olarak bu, performansı düşürebilir, ancak uygulamaların kendi önbelleğe alma işlemleri gibi özel durumlarda yararlıdır. Dosya G / Ç'si doğrudan kullanıcı alanı arabelleklerine yapılır. G / Ç senkronize, yani okuma (2) veya yazma (2) sistem çağrısının tamamlanmasında, verilerin aktarıldığından emin olunur. Aktarım boyutları ve kullanıcı arabelleği ve dosya ofseti hizalaması, dosya sisteminin mantıksal blok boyutunun katları olmalıdır.
Bu bayrak bir dizi Unix benzeri sistemde desteklenir; Çekirdek sürümü 2.4.10'da Linux altında destek eklendi.
Blok aygıtlar için semantik olarak benzer bir arabirim ham olarak tanımlanmıştır (8).

O_ASYNC

Bu dosya tanımlayıcısında giriş veya çıkış mümkün olduğunda bir sinyal (varsayılan olarak SIGIO, ancak bu fcntl (2) ile değiştirilebilir) üretin. Bu özellik sadece terminaller, sözde terminaller ve soketler için kullanılabilir. Daha fazla bilgi için bkz. Fcntl (2).

O_LARGEFILE

Büyük Dosya Sistemini destekleyen 32 bit sistemlerde, boyutları 31 bite dönüştürülecek dosyaların açılmasına izin ver.

Bu isteğe bağlı bayraklardan bazıları, dosya açıldıktan sonra fcntl kullanılarak değiştirilebilir.

Argüman modu , yeni bir dosya oluşturulduğunda kullanılacak izinleri belirtir. İşlemin umask tarafından her zamanki gibi değiştirilir: oluşturulan dosyanın izinleri (mod & umask) . Bu modun sadece yeni oluşturulan dosyanın gelecekteki erişimleri için geçerli olduğunu unutmayın; salt okunur bir dosya oluşturan açık çağrı, bir okuma / yazma dosya tanıtıcısını iyi döndürebilir.

Aşağıdaki sembolik sabitler mod için sağlanmıştır:

S_IRWXU

00700 kullanıcısı (dosya sahibi) okudu, yazdı ve izin verdi

S_IRUSR (S_IREAD)

00400 kullanıcı okuma izni var

S_IWUSR (S_IWRITE)

00200 kullanıcısı yazma izni var

S_IXUSR (S_IEXEC)

00100 kullanıcısı yürütme iznine sahiptir

S_IRWXG

00070 grubu okudu, yazdı ve izin verdi

S_IRGRP

00040 grubunun okuma izni var

S_IWGRP

00020 grubunun yazma izni var

S_IXGRP

00010 grubunun yürütme izni var

S_IRWXO

00007 kişi okudu, yazdı ve izin verdi

S_IROTH

00004 kişi daha okuma izni aldı

S_IWOTH

00002 tane daha yazarın

S_IXOTH

00001 kişi daha yürütme iznine sahiptir

O_CREAT bayraklarda olduğunda ve aksi halde göz ardı edildiğinde mod belirtilmelidir.

creat , O_CREAT | O_WRONLY | O_TRUNC'ye eşit olan bayraklarla açılacak şekilde eşdeğerdir.

GERİ DÖNÜŞ DEĞERİ

open ve creat , yeni dosya tanıtıcısını döndürür, ya da bir hata oluştuğunda -1 (bu durumda, errno uygun şekilde ayarlanır). Açmanın , aygıtın özel dosyalarını açabileceğini, ancak yaratıcılığın onları oluşturamayacağını unutmayın - bunun yerine mknod (2) kullanın.

UID eşleştirmesi etkinleştirilmiş NFS dosya sistemlerinde, açık bir dosya tanıtıcısı döndürür, ancak örneğin EACCES ile okuma (2) istekleri reddedilir. Bunun nedeni, istemcinin izinleri denetleyerek açık gerçekleştirmesidir, ancak UID eşlemesi, okuma ve yazma istekleri üzerine sunucu tarafından gerçekleştirilir.

Dosya yeni oluşturulduysa, atime, ctime, mtime alanları geçerli saate ayarlanır ve böylece ana dizinin ctime ve mtime alanlarıdır. Aksi takdirde, dosya O_TRUNC bayrağı nedeniyle değiştirilirse, ctime ve mtime alanları geçerli saate göre ayarlanır.

Hatalar

EEXIST

pathname zaten var ve O_CREAT ve O_EXCL kullanıldı.

EISDIR

yol adı bir dizine başvurur ve istenen erişim yazımı (yani O_WRONLY veya O_RDWR ayarlanır).

EACCES

Dosyaya istenen erişime izin verilmez veya yol adındaki dizinlerden biri arama (yürütme) iznine izin vermedi ya da dosya henüz mevcut değildi ve üst dizine yazma izni verilmiyor.

ENAMETOOLONG

yol adı çok uzundu.

ENOENT

O_CREAT ayarlanmamış ve adlandırılmış dosya mevcut değil. Ya da, yol adındaki bir dizin bileşeni mevcut değildir veya sallanan bir sembolik bağdır.

ENOTDIR

Yol dizininde bir dizin olarak kullanılan bir bileşen aslında bir dizin veya O_DIRECTORY belirtilmemiş ve pathname bir dizin değildi.

ENXIO

O_NONBLOCK | O_WRONLY ayarlanmış, adlandırılmış dosya bir FIFO'dur ve işlemin okunması için dosya açılmamıştır. Ya da, dosya bir aygıt özel dosyasıdır ve karşılık gelen aygıt yoktur.

ENODEV

yol adı , bir aygıt özel dosyasına başvuruda bulunur ve ilgili aygıt yoktur. (Bu bir Linux çekirdeği hatasıdır - bu durumda ENXIO iade edilmelidir.)

EROFS

pathname salt okunur dosya sistemindeki bir dosyaya başvurur ve yazma erişimi istendi.

ETXTBSY

pathname şu anda çalıştırılan ve yazma erişimi talep edilen yürütülebilir bir resme işaret eder.

EFAULT'tur

pathname , erişilebilir adres alanınızın dışında bulunur.

ELOOP

Yol adını çözümlemede çok fazla sembolik bağlantıyla karşılaşıldı veya O_NOFOLLOW belirtildi, ancak yol adı sembolik bir bağlantıydı.

ENOSPC

yol adı oluşturuldu, ancak yol adı içeren aygıtın yeni dosya için yer yok.

ENOMEM

Yetersiz çekirdek hafızası mevcuttu.

EMFILE

İşlem zaten maksimum sayıda açık dosyaya sahip.

ENFILE Sisemin

Sistemde açık olan toplam dosya sayısı sınırına ulaşıldı.

Uygun

SVR4, SVID, POSIX, X / OPEN, BSD 4.3 O_NOFOLLOW ve O_DIRECTORY bayrakları Linux'a özgüdür . Tanımlarını almak için _GNU_SOURCE makrosunu tanımlamak gerekebilir.

Kısıtlamalar

Protokolde, NFS'nin altında yatan ve O_SYNC ve O_NDELAY gibi diğer kişileri etkileyen birçok inziva var .

POSIX, O_SYNC , O_DSYNC ve O_RSYNC bayraklarına karşılık gelen üç farklı senkronize I / O varyantı sağlar . Şu anda (2.1.130) bunların hepsi Linux altında eşanlamlıdır.