大学生寒假在家过于无聊,整理一下以前学过的知识,顺便复习一下,水平较低,专业性差,仅供参考,不喜勿喷(反正也没人看)。
一、Linux中的设备管理
Linux采用文件系统管理硬件设备,所有的设备都看成是特殊的文件,从而将硬件设备的特性及管理细节对用户隐藏起来,实现设备无关性。(也就是说,我们想要操作设备,就需要去操作与该设备关联的文件)
(1)设备管理的特点
·每个设备都对应文件系统中的一个索引节点,都有一个文件名。
·应用程序通常可以通过系统调用open()打开设备文件,建立起与目标设备的连接。
·对设备的使用类似于对文件的存取。
·设备驱动程序都是系统内核的一部分,它们必须为系统内核或者它们的子系统提供一个标准的接口。
·设备驱动程序使用一些标准的内核服务,如内存分配等。
(2)设备分类
按设备属主关系
系统设备(系统在生成时,就已经被划入系统的管理范围的设备)
用户设备(后来出现的设备)
按设备信息交换单位来分
字符设备(提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取)
块设备(应用程序可以随机访问设备数据,程序可自行确定读取数据的位置)
按设备共享属性来分
独享设备
共享设备(打印机,U盘)
(3)设备工作原理
二、Linux设备操作
设备或文件操作两种方式:
·系统调用
·用户编程接口 API
(1)系统调用
·系统调用是操作系统提供给用户的一组“特殊”接口。
·系统调用并非直接和程序员或系统管理员直接打交道,而是通过软中断的方式向 内核提交请求,从而获取内核函数的服务入口。
·系统调用让系统从用户空间进入内核空间内运行,运行后将结果返回给应用程序 (在 linux 中,将 程序 的运行空间分为内核与用户空间(内核态和用户态),在 逻辑上它们之间是相互隔离的,因此 用户程序 不能访问内核数据,也无法使用内 核函数)。
(2)用户编程接口 API
api 就是应用程序接口,是一些预定义的函数。跟内核没有必然的联系。 API(Application Programming Interface)应用程序接口,是一些预先定义的函数, 提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访 问源码,或理解内部工作机制的细节。
(3)联系与区别
联系
·一个api可能会需要一个或多个系统调用来完成特定功能。通俗点说就是如果这个api需要跟内核打交道就需要系统调用,否则不需要。
区别
·API是函数,跟内核无直接关系;而系统调用是系统底层 的服务,实现内核提 供的某些服务
·移植性:API移植性更高;系统调用移植性差,对于不同的系统系统调用使用的函数会有区别
·系统API操作有缓存区,系统调用没有
·效率性:系统调用占用CPU大、系统API因为有缓存区,所以占用的资源相对较少、效率更高
·程序员调用的是API(API函数),然后通过与系统调用共同完成函数的功能;系统调用则不与程序员进行交互的,它根 据API函数,通过一个软中断机制向内核提交请求,以获取内核服务的接口。
(4)系统调用实例
有几种方法可以获得允许访问文件的文件描述符。最常用的是使用open()(打开)系统调用
函数原型
int open(const char *path, int flags);
参数
path :文件的名称,可以包含(绝对和相对)路径
f lags:文件打开模式
返回值
打开成功,返回文件描述符;
打开失败,返回-1
函数原型
int open(const char *path, int flags,mode_t mode);
参数
path :文件的名称,可以包含(绝对和相对)路径
flags:文件打开模式
mode: 用来规定对该文件的所有者,文件的用户组及系统中其他用户的访问 权限,则文件权限为:mode&(~umask)
返回值
打开成功,返回文件描述符;
打开失败,返回-1
打开文件的方式
访问权限
代码实例
#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
void main()
{
int outfd = 0;
outfd = open(“myfile",O_WRONLY|O_CREAT|O_TRUNC,S_IRWXU|S_IRGRP);
if(outfd==-1)
{
perror(“fail to open file\n”);
exit(-1);
}
else
{
perror(“success to open file\n”);
}
close(outfd); //关闭文件描述符
}
除了open() close(),还有许多系统调用的函数如write() read() lseek() fchmod()等等。
(5)系统调用与库函数的对比
open 与 fopen
前者属于低级IO,后者是高级IO。
前者返回一个文件描述符(用户程序区的)int,后者返回一个文件指针FILE*。
前者无缓冲,后者有缓冲。
前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
后者是在前者的基础上扩充而来的,在大多数情况下,用后者
read fread write fwrite类似
(6)文件操作流程
先打开文件——open
在对文件进行读(read)/写(write)操作
关闭文件——close
(7)什么是阻塞式函数
阻塞函数就是当这个函数不执行完,函数所在线程就一直停止在这里不动。
调用阻塞函数,当前线程挂起开始直到得到结果线程恢复,中间等待的过程就叫做阻塞等待。