FILE和int型文件描述符互相转换函数

      把FILE *的文件描述符转换成int型的fd函数是:int fileno(FILE *tream) ,把int型的fd文件描述符转换成FILE *的文件描述符函数是:FILE *fdopen(int fd, const char *mode)。互相转换后两者指向同一个流,如果关闭了其中一个,另一个也关闭了,如果尝试去关闭的

话就会返回错误。比如原先是FILE *型的,调用fileno得到一个int型的,先调用了fclose()关闭成功,再去调用close()将会返回错误。

在unix系统调用中,标准输入描述字用stdin,标准输出用stdout,标准出错用stderr表示,但在一些调用函数,引用了STDIN_FILENO表示标准输入才,同样,标准出入用STDOUT_FILENO,标准出错用STDERR_FILENO.
他们的区别:
stdin等是FILE *类型,属于标准I/O,在<stdio.h>。
STDIN_FILENO等是文件描述符,是非负整数,一般定义为0, 1, 2,属于没有buffer的I/O,直接调用系统调用,在<unistd.h>。


### 文件描述符及 `FILE` 结构体的概念 #### 文件描述符 文件描述符是一个整数,用于标识操作系统中已打开的文件或 I/O 资源。它提供了一种抽象机制来处理各种类的输入输出操作。在 Unix Linux 系统中,每个进程都有自己的文件描述符表,其中包含了该进程中所有打开文件的信息。 #### `FILE` 结构体 `FILE` 是标准 C 库中的一个不透明数据类,表示流(stream),通常用来封装底层的文件描述符其他控制信息。通过 `FILE*` 指针可以方便地进行高级别的文件读写操作。要从 `FILE` 对象获得其对应的文件描述符,可使用 `fileno()` 函数[^1]。 ```c #include <stdio.h> int main() { FILE *fp; fp = fopen("example.txt", "r"); if (fp != NULL) { int fd = fileno(fp); printf("File descriptor of example.txt is %d\n", fd); fclose(fp); } } ``` ### 使用文件描述符的操作 对于低级别的 I/O 操作,可以直接利用文件描述符来进行更精细的控制。例如,在多线程或多进程编程时,可能需要管理多个并发连接;此时,使用文件描述符集合 (`fd_set`) 来跟踪哪些文件准备好读取或写入会更加高效。下面展示了如何清除特定文件描述符的状态: ```c #include <sys/select.h> #include <unistd.h> void clear_fd(int fd, fd_set *set) { FD_CLR(fd, set); // 将参数文件描述符fd对应标志设置为0 } ``` 此外,在某些情况下,还需要跨进程共享文件资源。这可以通过复制文件描述符或将整个 `struct file` 结构传递给另一个进程实现[^3]。 ### 相关 API 及宏定义 当涉及到不同平台上的兼容性问题时,可以根据编译环境条件编译相应的代码片段。比如针对 Windows POSIX 平台的不同特性做出适配: ```cpp #ifdef _WIN32 #define EXPORT extern "C" __declspec(dllexport) #else // unix/linux #define EXPORT extern "C" #endif EXPORT void some_function() { // 实现细节... } ``` 上述例子展示了一个简单的导出函数声明方式,适用于创建动态链接库(DLL),使得其他程序能够调用此功能模块内的接口[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值