Dosya tanıtıcısını (FILE * fp) dosya tanımlayıcısına (int fd) nasıl dönüştürebilirim?


174

Bir var FILE *bir çağrı tarafından döndürülen, fopen(). Bunun gibi arama yapmak için ondan bir dosya tanımlayıcı almam gerekiyor fsync(fd). Bir dosya tanıtıcısından dosya tanımlayıcı alma işlevi nedir?


Veya dosyayı open (2) ile açabilirsiniz ve baştan bir dosya tanımlayıcıya sahip olursunuz
Antoine Pelisse

Yanıtlar:


214

Uygun fonksiyon int fileno(FILE *stream). Bu bulunabilir <stdio.h>ve POSIX standart ancak standart olmayan C olan


4
Açıkçası, eğer fonksiyon gerçekten standart C kütüphanesinin bir parçası olsaydı, herhangi bir başlıktan veya kütüphaneden bahsetmeye gerek kalmayacaktı. Ancak, standart değildir, bu nedenle en azından başlıktan bahsetmek mantıklı olabilir.
AnT

20
En azından derleyiciniz prototipler beklerse, standart C kütüphanesindeki işlevlere erişmek için üstbilgiler de gerekir (bu bağlamda gerçekten standart davranışın ne olduğunu asla hatırlamıyorum). Üstbilgiler olmadan, bir C dosyasının başında hiçbir ad tanımlanmaz.
Phil Miller

1
@Novelocrat: Hiçbir #includeşeye gerek olmadığı anlamına gelmiyordum . Sadece standart bir fonksiyon için uygun başlığın adını bulmanın her zaman kolay olduğunu kastediyorum . Yani cevapta tam başlık adından bahsetmek çok önemli değil.
AnT

9
Bu iyi bir cevaptır, ancak bunun standart bir c işlevi olmadığını, bir posix işlevi olduğunu belirtmek gerekir.
Evan Teran

6
C standardında değildir, çünkü dosya tanımlayıcıları UNIX'tir (Linux'ta açık (2), açık değil (3)).
kullanıcı değil

42

Bile fileno(FILE *)bir dosya tanıtıcı döndürebilir, baypas stdion en tamponuna ÇOK dikkatli olun. Arabellek verisi (okuma veya boşaltma yazma) varsa, dosya tanımlayıcısından gelen okuma / yazma işlemleri size beklenmedik sonuçlar verebilir.

Yan sorulardan birini yanıtlamak, dosya tanımlayıcısını DOSYA işaretçisine dönüştürmek için fdopen(3)


1
Bunun özellikle bunu arayan insanlar için yararlı olduğuna inanmıyorum ve bu OP'nin gönderisinin yorum yazılmadan bir ay önce yorum bölümünde zaten cevaplandı. Bu, gerçek bilginin aksine, daha mantıklı bir açıklamadır.
kevr

4
Sooooper önemli olan yorumların cevap olarak ortaya konulması gerekir. Yorumların büyük bir kısmı sizinki gibi
sinsi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.