2009-10-21 15 views
12

fdopen(), fileno() kullanarak, varolan dosya tanıtıcılarıyla akışları açmak mümkündür. Ancak bir dosyayı kapatmanın uygun yolu, bir akışla açtıktan sonraFILE işaretçisidir. Akışı nasıl kapatabiliriz, ancak açık dosya tanımlayıcısını nasıl tutabiliriz?Bir DOSYA işaretçisini temel dosya tanıtıcısını kapatmadan kapatın

Bu davranış, fflush() numaralı telefonu ve ardından fileno() numaralı telefonu aramakla kalmaz, daha sonra hiçbir zaman FILE işaretçiyi hiçbir zaman kapanışta yeniden kullanmaz. Ek bir endişe, daha sonra fdopen() tekrar ederseniz, şimdi birden çok FILE işaretçisi vardır ve bunlardan yalnızca birini kapatabilirsiniz. Eğer (Ben fileno() beri sen varsayıyorum) bir POSIXy sistemde iseniz

cevap

18

, dosya tanımlayıcısı klonlamak için dup() kullanabilirsiniz:

int newfd = dup(fileno(stream)); 
fclose(stream); 

Yoksa fdopen() yinelenen bir dosyayı teslim edebilirsiniz açıklayıcısı:

FILE *stream = fdopen(dup(fd), "r"); 

iki şekilde de, fd diğer kopyası FILE * ile kapanmaz. Ancak, konum işaretçisi 'un paylaşılan olduğunu aklınızda bulundurun; bu nedenle, her ikisini de aynı anda kullanıyorsanız dikkatli olun. Ayrıca, orijinal fd üzerinde tutulan fcntl() kilitleri, kopyasını kapattığınızda yayınlanacaktır.

+0

windows ve diğer platformlar desteği fileno()! Bu dup() çözümünü düşünmediğime inanamıyorum, çok zarif ve belirgin –

+0

Ayrıca yeni fd'yi orijinal fd'ye dup2() yapmanız ve sonra da yeni fd'yi kapatmanız gerekmiyor() Dosya akışı kapalı olduğu sürece her şey daha önce olduğu gibi geri döndü? : D Hangi fclose() yapmadan önce oldfd = fileno (stream) demektir. –

+0

Jonathan, çok iş parçacıklı uygulamalarda racy yapmaktır. Fd 'fdopen'e vermeden önce' dup 'yapmak daha iyidir, böylece orijinalinize asla dokunmadığından emin olabilirsiniz. – bdonlan

1

Her şey başarısız olursa, dup (2) yardımcı olabilir.

İlgili konular