linux c 之 系统编程(文件1)

linux c 系统编程–linux c 研发工程师

1、学习linux c 系统编程就是学习如何通过所学语言通过操作系统来访问硬件。
2、如何通过操作系统来访问硬件。

操作系统管理资源:
1、文件管理
2、进程管理
3、网络协议栈
4、设备管理

3、操作系统的构成
分为用户空间 和 内核空间。

为什么要分为内核空间和用户空间?

为了更好的保护内核空间,保护内核空间的数据,将程序的运行空间分为内核空间和用户空间,它们分别运行在不同的级别上,在逻辑上相互独立,因此,用户空间在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间的函数。

4、用户如何访问内核空间?

这里写图片描述

5、什么是系统调用
系统调用:操作系统提供给用户一组函数原型(用户可编程接口),用户程序通过这组接口来获得操作系统提供的服务。
用户可编程接口,简称API。

也可以通过硬件中断来访问系统资源。
这里写图片描述
这里写图片描述
系统调用的两种方式:硬件中断和软件中断。

二、嵌入式系统中文件的作用
1、一点哲学:
一切皆为文件。

2、文件类型分类:
-表示普通文件;
d表示目录文件;
l表示链接文件;
c表示字符设备;
b表示块设备;
p表示管道文件,如FIFO文件;
f表示堆栈文件,如LIFO。
s表示共享文件。

3、文件描述符:标识文件,使系统能够辨别文件
这里写图片描述

1、无缓冲访问文件
不带缓存的文件I/O操作,主要用到6个函数creat、open、read、write、lseek和close。这里的不带缓存是指每一个函数都只调用系统中的一个函数,这些函数虽然不是ANSI C的组成部分,但是是POSIX的组成部分。

六大基本文件操作API:

  1. int creat(const char *pathname , mode_t mode);
    所需头文件:
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>

 #include <errno.h> // errrno的头文件

功能:创建一个名叫pathname的文件,文件的属性为mode

返回值:出错返回-1,把错误对应的宏放在errno(显示errno 需要中
成功则返回文件的描述符

常用mode的几个宏:
(1)S_IRWXU 00700
(2)S_IRUSR 00400
(3)S_IRWXG 00070 S _IRWXO00007

注意:
(1)mode宏之间可以相 | 来实现多种属性,或者直接点0655等数字
(2)相同名文件创建,会覆盖,但属性不变,当创建的文件与已存在目录的名称一致时,会失败
(3)void perror(char *); 可以打印错误errno信息,能自动换行,在include ”stdio.h“中
(4)errno为全局变量,随时都有可能改变
(5)char *strerror(int errnum); 当给strerror传递errno时,可以打印宏对应的字符串,该函数在string.h中

  1. int open(const char *pathname, int flags);

    或者: int open(const char *pathname, int flags, mode_t mode);

    所需头文件:

 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
#include <errno.h>

功能:打开一个名叫pathname的文件,文件的属性为mode

返回值:出错返回-1,把错误对应的宏放在errno(显示errno 需要头文件)中
成功则返回文件的描述符

常用flags的宏:

(1)O_RDWR 读写方式
(2)O_RDONLY 只读
(3)O_WRONLY 只写
(4)O_CREAT 当没有该文件时,创建一个文件
(5)O_APPEND 追加打开

  1. int close(int fd);

    所需头文件:

#include <unistd.h>

功能:关闭fd文件(fd为文件描述)

返回值:出错返回-1,成功返回0

4.ssize_t write(int fd, const void *buf, size_t count);

所需头文件:

#include <unistd.h>

功能:将buf中的字符写入fd文件中,count为需要写入的字节长度(不能将整数直接写入,要转换)

返回值:出错返回-1,成功则返回实际写入的字节数,当没有写入时,为0

5.ssize_t read(int fd, void *buf, size_t count);

所需头文件:

#include <unistd.h>

功能:fd文件中的内容读入buf中,count为需要读入的字节长度(读入的一般为字符串)

返回值:出错返回-1,成功则返回实际读入的字节数,当没有写入时,为0

注意:当读和写都用同一块缓冲区时,要用memeset对缓冲区清零

6.off_ t lseek(int files, off_t offset, int whence);

所需头文件:

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

功能:修改files文件的读写指针

返回值:当前位置与开头之间的字节数

注意:
(1)offset为正时,向右移动指针,为负时,向左移动指针
(2)off_t 为重命名之后的有符号整型
(3)whence常用宏:

          SEEK_SET     开头位置
          SEEK_CUR     当前位置
          SEEK_END     结尾位置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值