Linux 文件描述符简介(file descriptor)
来源:互联网 发布:成都管家婆软件代理 编辑:程序博客网 时间:2024/05/21 09:50
可参考《Linux程序设计 第四版》
什么是文件描述符(file descriptor)
每个进程(运行中的程序)都有与之关联的文件描述符. 文件描述符通常是一些小的整数,我们可以通过一个进程的文件描述符访问该进程打开的文件或这设备. 一个进程能够有多少文件描述符取决于系统的配置. 当一个程序开始运行时, 它一般有三个文件描述符:
文件描述符(file descriptor)这个概念可能对初次接触Linux编程的人来说,是一个比较新的概念。拿人来举例子,我们有眼睛、耳朵、皮肤等输入设备;有嘴巴、四肢等输出设备;有时候人生病了,会有一些症状,我们也可以理解其为错误输出。
在类Unix操作系统中,每个进程也有这三种类似的东西,分别是上表中的标准输入、标准输出以及标准错误。更进一步,为了方便操作系统对进程进行管理,我们给每个文件描述符都编了号,0、1、2就分别是标准输入、标准输出以及标准错误的编号。
write系统调用
简单地说,write系统调用就是一个函数,它可以将缓冲区 buf 的前 nbytes 个字节写入与文件描述符相关联的文件中,它返回实际写入的字节数。其原型如下:
#include <unistd.h>size_t write(int fildes, const void *buf, size_t nbytes);
下面的程序,可以对这个命令行程序本生进行写操作:
#include <unistd.h>#include <stdio.h>int main(){ if(write(1, "Here is some data\n", 18) != 18) write(2, "A write error has occurred on file descriptor 1\n", 46); return 0;}
上面这段程序很简单,我们运行它的时候,它就是当前的进程,该程序的 if 语句将字符串 “Here is some data\n” 写入了自己的1号文件描述符,也就是标准输出。
因为它是命令行程序,所以标准输入是命令行的输入流,标准输出是命令行的输出流,所以当运行这个程序的时候,命令行会显示一个字符串 “Here is some data\n”。
下面是编译以及运行的结果:
$ gcc -o simple_write simple_write.c # compile$ ./simple_write # runHere is some data # standard output $
所以,文件描述符无非就是一些与当前进程相关的文件的数值表示(就好像一个班级里每个学生都有学号一样,能够方便地管理学生),我们可以方便地使用文件描述符进行各种操作。
- Linux 文件描述符简介(file descriptor)
- 文件描述符 (file descriptor)
- Linux编程基础:文件描述符file descriptor与inode
- 关于文件描述符(File descriptor)
- Linux 文件描述符(file descriptor, fd)以及文件描述符操作dup(), dup2()
- linux系统文件描述符file descriptor与inode的相关知识 , 文件描述符泄露
- file descriptor(文件描述符) & file descriptor flags(文件描述符标志) & file status flags(文件状态标志)
- linux系统文件描述符file descriptor与inode的相关知识
- linux系统文件描述符file descriptor与inode的相关知识
- linux系统编程之基础必备(三):文件描述符file descriptor与inode的相关知识
- linux系统编程之基础必备(三):文件描述符file descriptor与inode的相关知识
- linux系统编程之基础必备(三):文件描述符file descriptor与inode的相关知识
- linux系统编程之基础必备(三):文件描述符file descriptor与inode的相关知识
- python描述符Descriptor
- python 描述符descriptor
- python描述符 descriptor
- linux 文件描述符和库函数FILE文件指针关系
- VMware虚拟磁盘VMDK格式说明书1.1---3 The Descriptor File描述文件
- C++入门②:Hello World
- 【Android】图形图像处理之"自定义绘画"
- Cache和Buffer的区别
- docker安装-升级-卸载
- Android布局优化
- Linux 文件描述符简介(file descriptor)
- 第七届蓝桥杯解析参考
- 深度学习(18):无人汽车
- Longest Substring Without Repeating Characters
- 半双工和全双工的区别
- Java基础学习(四)
- ajax xmlhttp下open方法POST、GET参数的区别
- Git在eclipse和AndroidStudio中的使用
- Codeforces 780D-Innokenty and a Football League