ฉันจะแปลงตัวชี้ไฟล์ (FILE * fp) เป็น file descriptor (int fd) ได้อย่างไร?


174

ฉันมีกลับด้วยการโทรไปยังFILE * fopen()ฉันจำเป็นต้องได้รับการอธิบายไฟล์จากมันเพื่อการโทรให้เหมือนfsync(fd)มัน ฟังก์ชั่นในการรับไฟล์ descriptor จากตัวชี้ไฟล์คืออะไร?


หรือคุณสามารถเปิดไฟล์ด้วย open (2) และคุณจะมี file descriptor ตั้งแต่เริ่มต้น
Antoine Pelisse

7
และสิ่งที่ตรงกันข้าม: วิธีการรับตัวชี้ FILE จาก file descriptor?
Michael Burr

คำตอบ:


214

int fileno(FILE *stream)ฟังก์ชั่นที่เหมาะสมคือ มันสามารถพบได้ใน<stdio.h>และเป็นมาตรฐาน POSIX แต่ไม่ได้มาตรฐานซี


4
การพูดอย่างเคร่งครัดไม่จำเป็นต้องพูดถึงส่วนหัวหรือไลบรารีใด ๆ หากฟังก์ชันนั้นเป็นส่วนหนึ่งของไลบรารี C มาตรฐาน อย่างไรก็ตามมันไม่ได้เป็นแบบมาตรฐานซึ่งเป็นเหตุผลว่าทำไมจึงควรพูดถึงส่วนหัวอย่างน้อย
AnT

20
การเข้าถึงฟังก์ชั่นในไลบรารี C มาตรฐานนั้นจำเป็นต้องมีส่วนหัวอย่างน้อยถ้าคอมไพเลอร์ของคุณต้องการต้นแบบ หากไม่มีส่วนหัวจะไม่มีการกำหนดชื่อที่จุดเริ่มต้นของไฟล์ C
Phil Miller

1
@Novelocrat: ฉันไม่ได้หมายความว่าไม่จำเป็นต้องทำ#includeอะไรเลย ฉันแค่หมายความว่ามันง่ายที่จะหาชื่อของส่วนหัวที่เหมาะสมสำหรับฟังก์ชั่นมาตรฐาน คือมันไม่สำคัญจริงๆที่จะพูดถึงชื่อส่วนหัวที่แน่นอนในคำตอบ
AnT

9
นี่เป็นคำตอบที่ดี แต่ก็น่าสังเกตว่านี่ไม่ใช่ฟังก์ชัน c มาตรฐานมันเป็นฟังก์ชั่น posix
Evan Teran

6
มันไม่ได้อยู่ในมาตรฐาน C เพราะตัวอธิบายไฟล์เป็นสิ่งที่ UNIX (บน Linux มันเปิดอยู่ (2) ไม่เปิด (3))
ไม่ใช่ผู้ใช้แบบ

42

แม้ว่าfileno(FILE *)อาจส่งคืนไฟล์ descriptor ได้โปรดระวังอย่าให้บัฟเฟอร์ของ stdio หายไป หากมีข้อมูลบัฟเฟอร์ (อ่านหรือไม่เขียน) เขียน / อ่านจากไฟล์อธิบายอาจให้ผลลัพธ์ที่ไม่คาดคิด

ในการตอบคำถามด้านใดด้านหนึ่งในการแปลงไฟล์ descriptor เป็นตัวชี้ไฟล์ให้ใช้ fdopen(3)


1
ฉันไม่เชื่อว่าสิ่งนี้มีประโยชน์สำหรับผู้ที่ค้นหาสิ่งนี้โดยเฉพาะและสิ่งนี้ได้รับการตอบแล้วในส่วนความคิดเห็นของโพสต์ของ OP หนึ่งเดือนก่อนที่จะเขียน นี่เป็นการอธิบายเชิงตรรกะมากกว่าข้อมูลจริง
kevr

4
ความคิดเห็นที่เป็นสิ่งสำคัญเช่นนั้นต้องได้รับการยกให้เป็นคำตอบ ร้อยละขนาดใหญ่ของความคิดเห็นที่มีต่อว่าต่อขาน metacomments ไม่มีจุดหมายเหมือนของคุณ ... และอันนี้;)
Mark Gerolimatos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.