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.
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.
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. |
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.
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. |
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:
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.