Linux软件开发一直在Internet环境下讲行。Linux开发工作经常是在Linux用户决定共同完成一个项目时开始的。由于这个活跃的开发环境,新的以Linux为基础的软件功能日益强大,而且呈现爆炸式的增长态势。许多流行的Linux实用程序如C编译器、shell和编辑器都是GNU软件应用程序。Linux程序需要首先转化为低级机器语言即所谓的二进制代码以后,才能被操作系统执行。......
2023-11-19
对一个打开的文件而言,最常用到的就是对文件的读写操作,在Linux系统中,提供了系统调用函数实现文件的读写操作。
1.基于文件描述符的文件读写操作函数
(1)read()函数
read()函数从打开的文件(包括设备文件)中读取数据。该函数的定义形式如下:
#include<unistd.h>
ssize_t read(int fd,void∗buf,size_t count);
参数fd代表的是要进行读写的文件的描述符,参数buf代表的是读取的数据存放在buf指针所指向的缓冲区中,参数count代表的是读取的数据的字节数。读取文件数据时,文件的当前读写位置会向后移。需要注意的是:这个读写位置和使用C标准I/O库时的读写位置有可能不同,这个读写位置是记在内核中的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。
函数调用成功,返回值为读取的字节数,否则返回值为-1,并设置适当的errno值。返回的字节数有时候会小于参数count值。以下几种读取文件数据情况下,返回的字节数会小于count值。如:
●读常规文件时,在读到count个字节之前已到达文件末尾。例如,距文件末尾还有30个字节而请求读100个字节,则read返回30,下次read将返回0;
●从终端设备上读时,通常以行为单位,读到换行符就返回;
●从网络上读时,根据不同的传输层协议和内核缓存机制,返回值可能小于请求的字节数。
(2)write()函数
write()函数向打开的设备或文件中写入数据,该函数的定义形式如下:
#include<unistd.h>
ssize_twrite(int fd,const void∗buf,size_t count);
参数fd代表的是想要写入数据的文件的文件描述符,参数buf指向写入文件的数据的缓冲区,参数count代表的是写入文件的数据的字节数。函数调用成功时,返回值为写入的字节数,否则返回值为-1,并设置适当的errno值。当向常规文件写入数据时,返回值会是字节数count,但是向终端设备或者网络中写入数据,返回值则不一定为写入的字节数。
2.基于数据流的文件读写操作函数
基于数据流的字符输入输出操作,实际上就是以字节为单位的读写操作,在C标准库中常用的读写字符的函数是fgetc()和fputc()。
(1)fgetc()函数
#include<stdio.h>
int fgetc(FILE∗stream);
参数stream为FILE结构体类型的指针,用于指向一个文件。使得该函数从指定文件中读取一个字节。函数fgetc()如果调用成功,则返回读到的字节;如果出错或者读到文件末尾时返回EOF。在程序中,偶尔会遇到getchar()函数,也是用于读取一个字节,但是它为从标准输入读一个字节。在程序中调用getchar()函数相当于调用fgetc(stdin)。
在使用fgetc()函数时需要注意以下两点。(www.chuimin.cn)
a)调用fgetc()函数时,指定的文件的打开方式必须是可读的。
b)函数fgetc()调用成功时,返回的是读到的字节,应该为unsigned char类型,但fgetc()函数原型中返回值类型是int,原因在于函数调用出错或读到文件末尾时fgetc()会返回EOF,即-1,保存在int型的返回值中是0xffffffff,如果读到字节0xff,由unsigned char型转换为int型是0x000000ff,只有规定返回值是int型才能把这两种情况区分开,如果规定返回值是unsigned char型,那么当返回值是0xff时无法区分到底是EOF还是字节0xff。
(2)fputc()函数
fputc()函数主要用于向指定的文件写一个字节,该函数的定义形式如下:
#include<stdio.h>
int fputc(int c,FILE∗stream);
该函数可以理解为将字节c写入到stream指针所指向的文件中。函数如果调用成功,则返回写入的字节,否则,返回EOF。在程序中,偶尔会遇到putchar()函数,也是用于向文件中写入一个字节,但是它为向标准输出写一个字节。在程序中调用putchar()函数相当于调用fputc(c,stdout)。
在使用fputc()函数时需要注意,调用fputc()函数时,指定文件的打开方式必须是可写的(包括追加)。
C标准库函数为字符串的输入输出提供了fputs()函数和fgets()函数。fputs()函数与fputc()函数类似,不同的是fputc()每次只向文件中写一个字符,而fputs()函数每次向文件中写入一个字符串。fgets()函数与fgetc()函数之间的关系是读取字符串与读取字符的关系。
(3)fgets()函数
函数fgets()的定义形式如下:
#include<stdio.h>
char∗fgets(char∗s,int size,FILE∗stream);
该函数实现了从参数stream所指向的文件中读取一串小于参数size所表示的字节数的字符串;然后将字符串存储到s所指向的缓冲区中。函数调用成功时返回内容为返回指向s所指向的缓冲区部分的指针;函数调用出错或者读到文件末尾时返回NULL。
在调用fgets()函数读取字符串时,以读取到‘\n’转义字符为结束,并在该行末尾添加一个‘\0’组成完整的字符串。在size字节范围内没有读到‘\n’结束符,则添加一个‘\0’,组成字符串存储到缓冲区中,文件中剩余的字符,等待下次调用fgets()函数时再读取。
对于fgets而言,‘\n’是一个特别的字符,作为结束符;而‘\0’并无任何特别之处,只用作普通字符读入。正因为‘\0’作为一个普通的字符,因此无法判断缓冲区中的‘\0’究竟是从文件读上来的字符还是由fgets()函数自动添加的结束符,所以fgets()函数只用于读文本文件而不提倡读二进制文件,并且文本文件中的所有字符不能有‘\0’。
(4)fputs()函数
函数fputs()的定义形式如下:
#include<stdio.h>
int fputs(const char∗s,FILE∗stream);
此函数用于实现向stream指针指向的文件写入s缓冲区中的字符串。函数如果调用成功返回值为一个非负整数,否则返回EOF。缓冲区s中保存的是以‘\0’结尾的字符串,fputs将该字符串写入文件stream,但并不写入结尾的‘\0’,且字符串中可以有‘\n’也可以没有‘\n’。
有关ARM嵌入式系统原理与应用的文章
Linux软件开发一直在Internet环境下讲行。Linux开发工作经常是在Linux用户决定共同完成一个项目时开始的。由于这个活跃的开发环境,新的以Linux为基础的软件功能日益强大,而且呈现爆炸式的增长态势。许多流行的Linux实用程序如C编译器、shell和编辑器都是GNU软件应用程序。Linux程序需要首先转化为低级机器语言即所谓的二进制代码以后,才能被操作系统执行。......
2023-11-19
文件是Linux系统处理数据的基本单位,实际上,Linux系统所有的数据以及其他实体都是按照文件组织的。shell程序使用文件名通配符可以查询符合指定条件的文件名。......
2023-11-19
因为串口设备工作频率低且容易受到干扰,远距离传输会造成数据丢失。表7.5DB9(9针)接口的RS232串口数据线定义常见的串口工具软件都提供了RTS/CTS与XON/XOFF选项。这两个选项对应RS232串口的两种流量控制方式。RTS/CTS方式通过对串口控制器编程,设置接收缓冲区的高位标志和地位标志。高位标志和低位标志用于控制RTS和CTS信号线。......
2023-11-19
Linux内核主要由5个子系统组成:进程调度子系统、进程间通信子系统、内存管理子系统、虚拟文件系统子系统、网络接口子系统。Linux2.6.28内核的主要结构目录:/arch子目录包含了所有与硬件体系结构相关的内核移植代码。/Documentation子目录包含有关内核的许多非常详细的文档。/include子目录包含了建立内核代码时所需的大部分库文件的头文件,该模块利用其他模块重建内核。/ipc子目录包含了内核的进程间通信的代码。......
2023-11-19
Linux系统继承了UNIX系统的特点,文件系统的目录有约定的结构,并且每个目录也有约定的功能定义。图7.1Linux文件系统目录结构在Linux系统命令行下使用“ls/-p”可以得到根目录下目录的列表,图7.0是一个示意图。fsck程序会检测并尝试恢复不正确的文件,被恢复的文件会放在这个目录下。此目录并不是强制要求,目的是为了系统目录工整。创建硬链接后,已经存在的文件的I节点号会被多个目录文件项使用。......
2023-11-19
Linux系统中在访问文件和目录之前需要获取相应权限。图7.2Linux文件权限文件或目录的权限又分为3种:只读、只写、可执行,如表7.1所示。表7.1Linux文件权限表目录和文件访问权限的含义有所不同,区别如下:文件存取权限:读权限仅允许用户读取文件内容而无法进行其他操作;写权限允许用户修改文件内容;执行权限允许文件作为一个可执行程序运行。表示将/home/test01文件修改为所有用户具备执行权限。......
2023-11-19
Linux统按照文件中数据的特点对文件划分不同的类别,称做文件类型。Linux系统提供了一个file命令用来查看文件的类型,执行file<文件名>即可得到指定文件的类型。目录的第一项是目录本身,以“.”作为目录本身的名称。......
2023-11-19
用户应用程序调用设备的功能都是在设备驱动程序中定义的,也就是设备驱动程序中所定义的功能入口点函数。struct file_operations{};struct inode{};struct file{};编写设备驱动程序,很大一部分工作就是“填写”结构体中定义的函数。取得目录入口点,只用于与文件系统相关的设备驱动程序。一般编写设备驱动程序时并不一定要全部定义以上函数,只需定义对设备有意义的接口函数。fie结构主要是与文件系统对应的设备驱动程序使用。......
2023-11-19
相关推荐