嵌入式系统设计——Linux C开发-I/O技术(上)(6)

基本概念

1.嵌入式Linux系统开发:通过内核提供的服务实现相应的功能。
嵌入式LinuxC开发相当于“会看使用说明书”。
2.Linux系统空间划分:用户空间,内核空间
-用户空间不能随便访问内核空间
-划分空间的目的:保护内核空间不能被用户空间随便访问
3.系统调用:内核提供的安全访问机制;
硬件中断,软件中断
作用:使用户空间可以访问内核空间并获取服务
4.用户如何发送系统调用?
——必须发送文件调用
调用系统提供的函数接口
API:用户编程接口
5.文件描述符——文件id
动态分配:只有当操作这个文件时,系统才会给你分配文件描述符
非负整数:从3编号开始
0,1,2这三个文件描述符有其他作用

无缓冲访问文件(系统调用)的各种API

——(creat、read、write、open、lseek、close)

1.creat函数——创建文件
所需头文件:

#include<stdio.h>//c语言所需头文件
#include<sys/types.h>//类型定义
#include <sys/stat.h>//文件信息
#include <fcntl.h>

基本格式:

int creat (const char *pathname, mode-t mode) ;

函数传入值:
pathname:文件名
mode-t mode:文件权限

一些常用基本权限:
S_IRUSR 可读
S_IWUSR可写
S_IXUSR 可执行
S_IRWXU 可读可写可执行

当然也可以直接用上 0655 0表示8进制,6表示当前文件可读可写,5表示其它文件可读可执行(r 可读,w可写,x可执行,r=4,w=2,x=1)

一个函数的基本组成为函数名,形参,返回值
函数返回值:
成功:返回文件描述符
失败:-1
所以调用完一个函数要检查是否成功
检查错误使用函数perror(自动换行且打印系统的错误信息)

:创建名为hello.txt的文件,并检错。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
    int fd = creat ("hello.txt",0655);
    if(fd == -1)
    {
        perror("creat file error!");
        exit(1);
    }
    return 0;
}

2.open函数——打开文件
所需头文件:

#include<stdio.h>//c语言所需头文件
#include<sys/types.h>//类型定义
#include <sys/stat.h>//文件信息
#include <fcntl.h>

基本格式:
(1)

int open( const char pathname,int flags);

(2)

int open( const char pathname ,int flags,mode-t mode);

函数传入值:
pathname:被打开文件名(可包括路径名,缺省时为当前目录)
flags:文件打开的方式,参数可以通过“|”(或)组合构成,但前3个参数不能互相重合。
mode _t mode:被打开文件的存取权限,为8进制表示法(调用O_CREAT才需要)。

一些常用基本权限:
O_REONLY:只读方式打开文件
O_WRONLY:可写方式打开文件
O_RDWR:读写方式打开文件
O_CREAT:如果文件不存在时就创建一个新文件,并用第三个参数为其设置权限。
O_EXCL:如果使用O_CREAT时文件存在,则可返回错误信息。这一参数可测试文件是否存在。
O_NOCTTY:使用本参数时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端。
O_TRUNC:如文件已经存在,并且以只读或只写成功打开,那么会先全部删除文件中原因数据。
O_APPEND:以添加方式打开文件,在打开文件的同时,文件指针指向文件末尾。

注意:
可以用open代替creat操作,即文件打开的方式中加上O_CREAT
例:
将上例改为

int fd = open("hello.txt",O_RDWR | O_CREAT | O_APPEND , 0644);

3.write 函数——将内容写入文件
所需头文件:

#include<unistd.h>

基本格式:

int write(int fd,void*buf,size_t length)

函数传入值:
fd:文件描述符
buf:指定存储器写入数据的缓冲区
length:指定读出的字节数

即将buf中length长的内容写入fd中

可以通过函数:
memset(buffer,0,sizeof(buffer))
来清空缓冲区buffer

例:

char buffer[1024] = "hello world";
int w_len = write(fd, buffer, strlen(buffer));

4.read函数——读取文件内容至缓存区
所需头文件:

#include<unistd.h>

基本格式:

read(int fd, void *buf, size-t count)

函数传入值:
fd:文件描述符
buf:指定存储器写入数据的缓冲区
count:指定读出的字节数

即将buf中length长的内容写入fd中,和write的操作相反

例:

int r_len = read(fd, buffer, sizeof(buffer));

5.lseek函数—— 控制读写位置
所需头文件:

#include<unistd.h>
#include<sys/types.h>

基本格式:

int lseek(int fd,off_t offset,int whence)

函数传入值:
fd:文件描述符
offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)
whence:当前位置的基点:

一些常用基本权限:
SEEK_SET:当前位置为文件开头,新位置为偏移量的大小
SEEK_CUR:当前位置为文件指针位置,新位置为当前位置加上偏移量
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量大小

例:

lseek(fd,0,SEEK_SET);//指向这行开头
lseek(fd,0,SEEK_END);//计算文件内容长度

6.close函数——关闭文件
基本格式:

close(fd);

用在编程结尾处
例:

int fd = open("hello2.txt",O_RDWR | O_CREAT | O_APPEND , 0644);
close(fd);

7.原生态函数不够用时要学会自己封装函数
:逐行读取

int read_line(int fd, char *buffer, int max_len)
{
    int i;
    int r_len;

    char temp;

    for (i = 0; i < max_len; i++)
    {
        r_len = read(fd, &temp, 1);
        if (r_len == -1)
        {
            perror("read data error!");
            break;
        }

        if (r_len == 0)
        {
            break;
        }

        if (temp == '\n')
        {
            break;
        }

        buffer[i] = temp;
    }

    return i;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值