文件描述符

嵌入式Linux应用编程-文件IO

十年热恋 提交于 2020-02-18 15:24:22
近期学习了下嵌入式Linux应用编程,一边学习一边记录下关键知识,也是在学习的过程进行下简单梳理。 文件I/O 用户在应用开发过程中会经常需要访问文件。Linux下访问文件的方式有两大类:标准I/O和文件I/O。 文件I/O特点: (1)posix(可移植操作系统接口)定义的一组函数。 (2)不带缓冲机制,每次操作都引起系统调用。 (3)通过文件描述符来访问文件。 (4)访问各种类型文件(7种:- d c b s l p)。 1、文件类型 -:普通文件:可执行文件、文本文档、脚本 d:目录文件 c:字符设备 b:块设备 s:网络设备、socket l:软链接 p:管道 2、文件描述符 每个打开的文件都对应一个文件描述符。 文件描述符是一个非负整数。Linux为程序中每个打开的文件分配一个文件描述符。 文件描述符从0开始分配,依次递增。 在文件IO中默认打开了三个文件描述符0,1,2。对应标准输入、标准输出、标准出错。 3、接口 打开文件 int open(const char *pathname, int flags); 功能:打开一个文件,并且返回一个文件描述符供后续读写类接口使用。 读文件 ssize_t read(int fd, void *buf, size_t count); 功能:从文件描述符为fd的文件/设备读取最大count个字节的数据 写文件 ssize_t

Python Select 解析

怎甘沉沦 提交于 2020-02-18 07:13:43
首先列一下,select、poll、epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()来调用系统监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。 select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一。 select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制。 另外,select()所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。同时,由于网络响应时间的延迟使得大量TCP连接处于非活跃状态,但调用select()会对所有socket进行一次线性扫描,所以这也浪费了一定的开销。 poll poll在1986年诞生于System V Release 3,它和select在本质上没有多大差别,但是poll没有最大文件描述符数量的限制。 poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。

read/write函数

旧街凉风 提交于 2020-02-18 03:33:47
调用read函数从打开文件读数据。 #include<unistd.h> ssize_t read( int filedes, void *buf, size_t nbytes); 从 filedes 中读取数据到 buf 中,nbytes 是要求读到的字节数。 返回值:若成功则返回实际读到的字节数,若已到文件尾则返回0,若出错则返回-1。 当从终端设备读时,通常一次最多读一行。 ssize_t 提供带符号的返回值,size_t不带符号。 调用write函数向打开的文件写数据。 #include<unistd.h> ssize_t write (int filedes, const void *buf, size_t nbytes); 从 buf 中写数据到 filedes 中,nbytes 是相求写入的字节数。 返回值:返回值通常与参数 nbytes相同,否则表示出错。 文件描述符 filedes是一个 int型数,通常用文件描述符0与进程的标准输入相关联,文件描述符1与进程的标准输出相关联,文件描述符2与进程的标准出错输出相关联。在依从POSIX的应用程序中, 幻数0,1,2应当替换成符号常量 STDIN_FILENO,STDOUT_FILENO 和 STDERR_FILENO 。这些常量都定义在头文件<unistd.h>中。 标准输入/输出常量 stdin 和 stdout

STDIN_FILENO vs stdin

无人久伴 提交于 2020-02-18 03:32:56
数据类型不一致: stdin类型为 FILE* STDIN_FILENO类型为 int 使用stdin的函数主要有:fread、fwrite、fclose等,基本上都以f开头 使用STDIN_FILENO的函数有:read、write、close等 可用fileno()转换 1.STDIN_FILENO的作用 STDIN_FILENO属于系统API接口库,其声明为 int 型,是一个打开文件句柄,对应的函数主要包括 open/read/write/close 等系统级调用。 操作系统一级提供的文件API都是以文件描述符来表示文件。STDIN_FILENO就是标准输入设备(一般是键盘)的文件描述符。 2.区别 1)数据类型不一致: stdin类型为 FILE* STDIN_FILENO类型为 int 使用stdin的函数主要有:fread、fwrite、fclose等,基本上都以f开头 使用STDIN_FILENO的函数有:read、write、close等 2)stdin等是FILE *类型,属于标准I/O,高级的输入输出函数。在<stdio.h>。 STDIN_FILENO等是文件描述符,是非负整数,一般定义为0, 1, 2,属于没有buffer的I/O,直接调用系统调用,在<unistd.h>。 3)STDIN_FILENO 是标准输入的文件描述符 详见/usr/include

fileno函数与ftruncate函数

我的未来我决定 提交于 2020-02-18 03:28:40
fileno()函数 功 能:把文件流指针转换成文件描述符 相关函数:open, fopen 表头文件:#include <stdio.h> 定义函数:int fileno(FILE *stream) 函数说明:fileno()用来取得参数stream指定的文件流所使用的文件描述词 返回值 :返回和stream文件流对应的文件描述符。如果失败,返回-1。 范例: #include <stdio.h> main() { FILE *fp; int fd; fp = fopen("/etc/passwd", "r"); fd = fileno(fp); printf("fd = %d/n", fd); fclose(fp); } 文件描述词是Linux编程中的一个术语。当一个文件打开后,系统会分配一部分资源来保存该文件的信息,以后对文件的操作就可以直接引用该部分资源了。文 件描述词可以认为是该部分资源的一个索引,在打开文件时返回。在使用fcntl函数对文件的一些属性进行设置时就需要一个文件描述词参数。 以前知道,当程序执行时,就已经有三个文件流打开了,它们分别是标准输入stdin,标准输出stdout和标准错误输出stderr。和流式文件相对应的是,也有三个文件描述符被预先打开,它们分别是0,1,2,代表标准输入、标准输出和标准错误输出。 需要指出的是,上面的流式文件输入

【linux编程实践教程(Bruce Molay)】第十章 IO重定向和管道

浪尽此生 提交于 2020-02-16 13:11:00
一 shell编程 comm命令:比较两个文件是否相等 二 IO重定向 1-基础 很多Unix命令都被称为Unix工具 一个进程(一个使用中的命令)都会产生一个存放文件描述符的数组,该数组中的下标就是文件描述符的号,0,1,2三位是进程的标准输入输出和错误流(进程接收0位的输入,从1位输出)。 最低可用文件描述符原则 2-将进程的标准输入重定向到文件 进程的标准输入默认是连接终端的 关闭0原本的管道; 打开文件,文件描述符自动赋为0 dup函数和dup2函数 3-将命令的输出重定向到文件 fork()出子进程之后,在子进程中关闭原始的文件描述符1,然后打开新文件,再用execlp调用新命令 注意调用新命令后,进程中的代码被替换,但文件描述符数组没有被替换 三 管道 使用fork()来共享管道 newfd1=dup2(pipe1[0],0); 理解:内核中默认存在三个管道(连接终端的 输入,输出和错误流 );每次创建一个进程都会将该进程中的文件描述符数组中的前三位与该三个管道( 称为内核管道 )连接(即搭建管道( 称为连接管道 ));上述代码先删除了文件描述符0连接输入型内核管道的连接管道,再将文件描述符0与文件描述符pipe1[0]连接的内核管道连接;最后需要调用close(pipe1[0]),删除该文件描述符与内核管道的连接管道。 读管道不注意就会发生读取阻塞现象:

java nio多路复用 selector

房东的猫 提交于 2020-02-12 19:36:59
文章目录 多路复用selector 多路复用 unix内核中的select/epoll/poll select poll epoll 代码样例 多路复用selector 多路复用 I/O多路复用,I/O是指网络I/O, 多路指多个TCP连接(即socket或者channel),复用指复用一个或几个线程;简单来说:就是使用一个或者几个线程处理多个TCP连接;最大优势是减少系统开销小,不必创建过多的进程/线程,也不必维护这些进程/线程;多路复用分为三种形式select/epoll/poll,在 Java 中, Selector 这个类是 select/epoll/poll 的外包类 , 在不同的平台上, 底层的实现可能有所不同, 但其基本原理是一样的, 其原理图如下所示: unix内核中的select/epoll/poll select 函数: int select ( int maxfdp1 , fd_set * readset , fd_set * writeset , fd_set * exceptset , const struct timeval * timeout ) 返回值:就绪描述符的数目,超时返回 0 ,出错返回 - 1 maxfdp1:描述符个数 * readset、 * writeset、 * exceptset:读、写和异常条件的描述字 * timeout

Linux编程概念

China☆狼群 提交于 2020-02-12 15:25:15
   这一节主要展现一个关于Linux环境提供的服务的简要概览。所有的Unix系统,包括Linux系统,都提供了一个功能的抽象和接口集合。事实上,这个共同点定义了Unix。如对文件和进程的抽象、管道和套接字管理的接口等等,都是Unix的核心。   这个概览假定你已经熟悉了Linux环境:可以熟练使用shell,使用基本命令,编译简单的C程序。这些并不是Linux的概览,也不是Linux编程环境的内容,而是进程Linux系统编程的最基本的知识。 1. 文件和文件系统   文件是Linux中最基本和重要的抽象。Linux遵循一切皆是文件的理念()。因此,很多的交互工作时通过读取和写入文件来完成的,就算问题的目标并不是你日常所想的文件。   文件必须打开才能被访问。文件可以以只读的方式或者只写的方式打开,或者两者兼有。一个打开的文件通过唯一的文件描述符进行引用,该描述符是打开文件的 元数据 至其本身的映射。在Linux内核中,这个描述符称为文件描述符,用一个整数表示(C语言中的类型为 int ),简写为 fd 。文件描述符在 用户空间 中共享,允许用户程序用文件描述符直接访问文件。大部分的Linux系统编程包括对文件描述符的打开,关闭等操作。 2. 普通文件   我们常常说起的文件,就是Linux中的普通文件。一个普通文件包含以线性字节数组方式组织的数据,通常也称为字节流。在Linux中

IO多路复用

天大地大妈咪最大 提交于 2020-02-12 12:03:13
一.IO多路复用 前面用协程实现IO阻塞自动切换,‘如何去实现事件驱动的情况下IO的自动阻塞的的切换,这个学名叫IO多路复用。 比如socketsew64hmay'y'yver,多个客户端连接,单线程下实现并发效果,这就叫多路复用. 同步io和异步IO,阻塞IO和非阻塞IO的区别? 二.IO模型的前戏准备   1.用户空间与内核空间     操作系统的核心是内核,独立于普通应用程序,可以访问受保护的内存空间也有访问底层硬件的权限     为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。     各个进程的使用,称为用户空间。   2.进程切换     为了控制进程的执行,内核必须有能力挂起正在CPU运行的程序,并恢复以前挂起的某个进程。进程切换由操作系统完成,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关.     把进程的pbc移入相应的队列,选择另一个进程执行,并更新pbc。   3.进程的阻塞     正在执行的进程,由于期待的某些事件未发生,入请求系统资源失败,等待某种操作的完成,新数据尚未到达或无新工作等。则由系统自动执行阻塞,使自己由运行状态变为阻塞状态。进程阻塞是进程自身的一种主动行为,因此只有处于运行状态的进程(获得cpu),才可能将其转换为阻塞状态。当进程进入阻塞状态

MySQL最大连接数设置

感情迁移 提交于 2020-02-09 04:28:08
“Can not connect to MySQL server. Too many connections”-mysql 1040错误, 这是因为访问MySQL且还未释放的连接数目已经达到MySQL的上限。通常,mysql的最大连接数默认是100, 最大可以达到16384 第一种:命令行修改。 mysql>mysql -uuser -ppassword(命令行登录MySQL) mysql>show variables like 'max_connections';(查可以看当前的最大连接数) msyql>set global max_connections=1000;(设置最大连接数为1000,可以再次查看是否设置成功) mysql>exit(推出) 这种方式有个问题,就是设置的最大连接数只在mysql当前服务进程有效,一旦mysql重启,又会恢复到初始状态。 因为mysql启动后的初始化工作是从其配置文件中读取数据的,而这种方式没有对其配置文件做更改 第二种:修改配置文件。 这种方式说来很简单,只要修改MySQL配置文件my.ini 或 my.cnf的参数max_connections,  将其改为max_connections=1000,然后重启MySQL即可。但是有一点最难的就是my.ini这个文件在哪找。 通常有两种可能,一个是在安装目录下(这是比较理想的情况)