Geçici Dosyalar
Önceki XIV. Oylum - Dosya Sistemi Arayüzü Sonraki
Geçici Dosyalar
Yazılımınızda bir geçici dosya kullanmanız gerekiyorsa, onu açmak için tmpfile işlevini ya da geçici dosyaya bir isim vermek ve onu sonradan fopen ile açmak istiyorsanız tmpnam (daha iyisi: tmpnam_r) işlevini kullanabilirsiniz.
tempnam işlevi tmpnam gibidir, ancak geçici dosyaların gideceği dizini belirtebilirsiniz, bunun dışında dosya isimlendirmesi aynı yöntemle yapılır. Çok evreli yazılımlar açısından tempnam işlevinin evresel olması ama tmpnam işlevinin bir durağan tampona gösterici döndürmesiyle evresel olmaması önemli bir farktır.
Bu oluşumlar stdio.h balık dosyasında bildirilmiştir.
FILE *tmpfile
(void)
işlev
Bu işlev, "wb+" kipinde (güncelleme kipi) fopen çağrısı ile açılmış gibi bir geçici ikilik dosya oluşturur. Bu dosya kapatıldığında ya da yazılım sonlandığında dosya özdevinimli olarak silinir. (Bazı diğer ISO C sistemlerinde eğer yazılım anormal şekilde sonlanırsa dosya silinmeyebilir.)
Bu işlev evreseldir.
Kaynakların 32 bitlik bir sistemde _FILE_OFFSET_BITS == 64 ile derlendiği durumda bu işlev aslında tmpfile64 işlevidir, yani LFS arayüzü eski arayüzün yerine geçer.
FILE *tmpfile64
(void)
işlev
Bu işlev tmpfile işlevine benzer, ancak dönen akım 32 bitlik makinelerde 2^31 bayttan daha büyük dosyalar için kullanılabilir.
Dönüş türünün hala FILE * olduğunu, LFS arayüzüne özel bir FILE türü olmadığına lütfen dikkat edin.
32 bitlik bir sistemde, kaynakların _FILE_OFFSET_BITS == 64 ile derlendiği durumda bu işlev tmpfile ismiyle bulunur ve eski gerçekleme tamamen LFS'ye uygun olarak değiştirilir.
char *tmpnam
(char *sonuç)
işlev
Bu işlev herhangi bir mevcut dosyaya ait olmayan bir geçerli dosya ismi oluşturur ve bunu döndürür. Eğer sonuç argümanı bir boş gösterici ise dönüş değeri bir dahili durağan dizgeye bir gösterici olup, işlevin daha sonraki çağrıları ile üzerine yazılabilir, dolayısıyla bu durumda işlev evresel olmayacaktır. Aksi takdirde, sonuç argümanı en az L_tmpnam karakterlik bir diziye gösterici olmalıdır. Bu durumda sonuç bu diziye yazılacak ve işlev evresel olacaktır.
Önceden oluşturulmuş dosyaları silmeden defalarca tmpnam çağrısı yaparsanız işlevin başarısız olma olasılığı vardır. Bu, geçici dosya isimlerine ayrılan uzunluğun sınırlı olması nedeniyle işlevin sadece sonlu sayıda farklı isme imkan vermesindendir. Eğer işlev başarısız olursa bir boş gösterici döndürür.
Uyarı
Dosya isminin oluşturulması sırasında, başka bir süreç daha tmpnam kullanarak aynı isimde bir dosya oluşturursa, bu bir güvenlik açığına yol açabilir. Gerçekleme tahmini zor isimler üretir, fakat yine de dosyayı açarken O_EXCL seçeneğini kullanmalısınız. Bu sorunla karşılaşmamak için en iyi yöntem tmpfile veya mkstemp kullanmaktır.
char *tmpnam_r
(char *sonuç)
işlev
Bu işlev, eğer sonuç bir boş gösterici ise boş gösterici döndürmesi dışında tmpnam işlevininin hemen hemen aynısıdır.
tmpnam işlevinin evresel olmayan kullanımına karşı bir önlem içermesiyle bu işlevin evresel olması garanti edilmiştir.
Uyarı
Bu işlev de tmpnam işlevinin oluşturabildiği güvenlik açığı sorunundan muzdariptir.
int L_tmpnam
makro
Bu makronun değeri tmpnam işlevi ile üretilen dosya ismini tutacak yeterli büyüklükteki dizge için en küçük uzunluğu veren bir tamsayı sabit ifadesidir.
int TMP_MAX
makro
TMP_MAX makrosunun değeri tmpnam ile oluşturulabilecek geçici dosya isimlerinin sayısının alt sınırıdır. tmpnam işlevini, çok fazla geçici dosyaya sahip olduğunuzu belirterek başarısız olmadan en azından bu kadar defa çağırabilirsiniz.
GNU kütüphanesi ile çok büyük sayıda geçici dosya ismi oluşturabilirsiniz. Eğer bu isimlerle gerçekten dosya oluşturmaya çalışırsanız daha isimler tükenmeden disk üzerindeki yeriniz tükenebilir. Diğer sistemlerde sabit ve daha az sayıda geçici dosya ismi oluşturulabilir ve bu sınır asla 25'i aşmaz.
char *tempnam
(const char *dizin,
 const char *önek)
işlev
Bu işlev tamamen eşsiz bir geçici dosya ismi oluşturur. Eğer önek bir boş gösterici değilse, bu dizgenin ilk beş karakteri dosya isminde önek olarak kullanılır. İşlevin dönüş değeri malloc ile ayrılmış bir dizgedir. Dolayısıyla bu alanla işiniz bittiğinde, artık kullanmayacaksanız free ile serbest bırakmalısınız.
Dönen dizge özdevimli olarak ayrıldığından bu işlev evreseldir.
Geçici dosya isminin dizin öneki aşağıdaki listedeki maddeler sırayla uygulanarak saptanır. Dizin mevcut ve yazılabilir olmalıdır.
  • Eğer tanımlıysa, TMPDIR ortam değişkeni. Güvenlik kaygılarıyla bu sadece yazılım SUID ya da SGID etkin değilse uygulanır.
  • Bir boş gösterici değilse, dizin argümanı.
  • P_tmpdir makrosunun değeri.
  • /tmp dizini.
Bu işlev SVID uyumluluğu için tanımlanmıştır.
Uyarı
Dosya isminin oluşturulması sırasında, başka bir süreç daha tmpnam kullanarak aynı isimde bir dosya oluşturursa, bu bir güvenlik açığına yol açabilir. Gerçekleme tahmini zor isimler üretir, fakat yine de dosyayı açarken O_EXCL seçeneğini kullanmalısınız. Bu sorunla karşılaşmamak için en iyi yöntem tmpfile veya mkstemp kullanmaktır.
char *P_tmpdir
SVID makrosu
Bu makro geçici dosyalar için öntanımlı dizin ismidir.
Daha eski Unix sistemleri burya kadar bahsedilen işlevlere sahip değildi. Bunların yerine mktemp ve mkstemp işlevleri kullanılırdı. Bu işlevlerin her ikisi de belirttiğiniz bir dosya ismi şablon dizgesini değiştirerek çalışır. Bu dizgenin son altı karakteri XXXXXX olmalıdır. Bu altı X dizgenin eşsiz olmasını sağlamak üzere altı karakterle değiştirilir. Kullanılan şablon dizgesi şuna benzer:
    /tmp/önekXXXXXX
Burada önek yazılım tarafından belirlenen eşsiz bir dizgedir.
Not
mktemp ve mkstemp şablon dizgesini değiştirdiklerinde dolayı, dizgeyi bir sabit olarak aktarmamalısınız. Dizge sabitler normalde salt-okunur saklama alanına sahiptir. Bu bakımdan mktemp veya mkstemp dizge sabitini değiştirmeye çalışırsa yazılımınız çökebilir.
Bu işlevler stdlib.h başlık dosyasında bildirilmiştir.
char *mktemp
(char *şablon)
işlev
mktemp işlevi, yukarıda açıklandığı gibi şablon dizgesini değiştirerek eşsiz bir dosya ismi üretir. İşlev başarılı olduğunda değiştirilen şablon ile döner. Eğer işlev eşsiz bir isim bulamazsa şablon'u boş dizge haline getirip döner. Eğer şablon'un son altı karakteri XXXXXX değilse işlev bir boş gösterici döndürür.
Uyarı
Dosya isminin oluşturulması sırasında, başka bir süreç daha mktemp kullanarak aynı isimde bir dosya oluşturursa, bu bir güvenlik açığına yol açabilir. Gerçekleme tahmini zor isimler üretir, fakat yine de dosyayı açarken O_EXCL seçeneğini kullanmalısınız. Bu sorunla karşılaşmamak için en iyi yöntem mkstemp kullanmaktır.
int mkstemp
(char *şablon)
işlev
mkstemp işlevi mktemp'in yaptığı gibi bir eşsiz dosya ismi oluşturur, fakat ayrıca dosyayı sizin için open (Dosyaların Açılması ve Kapatılması) ile açar. İşlev başarılı olursa, şablon dizgesini yerinde değiştirir ve dosyayı okuma ve yazma için açarak bir dosya tanıtıcı ile döner. Eğer işlev bir eşsiz dosya ismi oluşturamazsa, -1 ile döner. Eğer şablon dizgesi XXXXXX ile bitmiyorsa, işlev -1 ile döner ve şablon dizgesini değiştirmez.
Dosya 0600 kipi ile açılır. Eğer dosyaya diğer kullanıcılarında erişebilmesi isteniyorsa bu kip ayrıca değiştirilmelidir.
mktemp'in aksine, mkstemp işlevi bir geçici dosya oluşturmaya çalışan başka yazılımlarla çatışmadan eşsiz bir dosya oluşturmayı garanti eder. Bu, open işlevinin O_EXCL seçeneği ile kullanmasından dolayıdır (bu seçenek sayesinde, dosyayı oluşturmak isterseniz ve böyle bir dosya mevcutsa bir hata alırsınız).
char *mkdtemp
(char *şablon)
işlev
mkdtemp işlevi, ismi eşsiz bir dizin oluşturur. Başarılı olursa dizinin ismini şablon'a yazar ve şablon ile döner. mktemp ve mkstemp gibi şablon dizgesi XXXXXX ile bitmelidir.
Eğer mkdtemp bir eşsiz isimli dizin oluşturamazsa, boş gösterici ile döner ve errno değişkenine ilgili hata durumını atar. Eğer şablon dizgesi XXXXXX ile bitmiyorsa, mkdtemp işlevi NULL ile döner ve şablon'u değiştirmez. Bu durumda errno değişkenine EINVAL atanır.
Dizin 0700 kipiyle oluşturulur.
mkdtemp işlevi bir geçici dizin oluşturmaya çalışan başka yazılımlarla çatışmadan eşsiz bir dizin oluşturmayı garanti eder. Bu, open işlevini O_EXCL seçeneği ile kullanmasından dolayıdır. Bkz. Dizinlerin Oluşturulması.
mkdtemp işlevi OpenBSD'den gelir.
Önceki Üst Ana Başlık Sonraki
Özel Dosyaların Oluşturulması Başlangıç XV. Oylum - Borular ve FIFOlar
Bir Linux Kitaplığı Sayfası