IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux——设备管理及文件IO(一) -> 正文阅读

[系统运维]Linux——设备管理及文件IO(一)

一、引言

  • 理解设备和文件的关系
  • 理解系统调用和系统API等关系
  • 掌握系统调用的工作过程
  • 掌握系统调用open/read/write/fcntl等使用

二、Linux中的设备管理

1、设备无关性

为了提高操作系统的可适应性和可扩展性,目前几乎所有的操作系统都实现了设备的独立性(Device Independence)

Linux采用文件系统管理硬件设备,所有的设备都看成是特殊的文件(目录、套接字也可以是文件),从而将硬件设备的特性及管理细节对用户隐藏起来,实现设备无关性。

2、设备管理的特点

  1. 每个设备都对应文件系统中的一个索引节点,都有一个文件名
  2. 应用程序通常可以通过系统调用open()打开设备文件,建立起与目标设备的连接。
  3. 对设备的使用类似于对文件的存取。
  4. 设备驱动程序都是系统内核的一部分,它们必须为系统内核或者它们的子系统提供一个标准的接口。
  5. 设备驱动程序使用一些标准的内核服务,如内存分配等。

3、设备分类

按设备信息交换单位来分:字符设备、块设备

按设备属主关系:系统设备、用户设备。

按设备共享属性来分:独享设备、共享设备(打印机,U盘)。

?4、Linux设备操作

设备或文件操作两种方式:用户编程接口 API、系统调用。

三、系统调用

系统调用是操作系统提供给用户的一组“特殊”接口

系统调用并非直接和程序员或系统管理员直接打交道,而是通过软中断的方式向内核提交请求,从而获取内核函数的服务入口(系统调用表)。

系统调用让系统从用户态进入内核态内运行,运行后将结果返回给应用程序(内核态–>用用户态)。

1、系统调用和系统API等区别

①系统API
主要是通过C库libc来实现,程序员多采用这种方式与内核交互,这些API通过系统调用来实现。

②系统命令
系统管理员采用系统命令与内核交互,是一个可执行文件,通过系统API及系统调用来实现。

2、函数库调用与系统调用
?

函数库调用系统调用
在所有啊ANSIC编译器版本中,C库函数是相同的各个操作系统的系统调用是不同的
它调用函数库中的一段程序(或函数)它调用系统内核的服务
与用户程序相联系是操作系统的一个入口函数
在用户地址空间执行在内核地址空间执行
它的运行时间属于“用户时间”它的运行时间属于“系统”时间
属于过程调用,调用开销较小需要在用户空间和内核上下文环境间切换,开销较大
在C函数库libc中大约300个函数在UNIX中大约有90个系统调用
典型的C函数库调用:system fprintf malloc典型的系统调用:chdir fork write br

3、 C库的文件操作

4、文件描述符fd

每个进程PCB(进程控制块)结构中有文件描述符指针,指向files_struct的文件描述符表,记录每个进程打开的文件列表。

系统内核不允许应用程序访问进程的文件描述符表,只返回这些结构的索引即文件描述符ID(File Description)给应用程序。

Linux系统中,应用程序通过这些文件描述符来实现让内核对文件的访问每个进程能够访问的文件描述符是有限制的,通过ulimit –n可以查看。

特殊文件描述符号

  • 0? ?STDIN_FILENO ?标准输入流
  • 1? ?STDOUT_FILENO?? ?标准输出流
  • 2? ?STDERR_FILENO 标准错误流


每个进程被加载后,默认打开0,1,2这三个文件描述符。

5、open系统调用

有几种方法可以获得允许访问文件的文件描述符。最常用的是使用open()(打开)系统调用

函数原型:

①int open(const char *path, int flags);
②int open(const char *path, int flags,mode_t mode);

参数:

  • ?? ?path:文件的名称,可以包含(绝对和相对)路径
  • ?? ?flags:文件打开模式
  • ?? ?mode:用来规定对该文件的所有者,文件的用户组及系统中其他用户的访问权限,则文件权限为:mode&(~umask)

返回值:
?? ?打开成功,返回文件描述符;
?? ?打开失败,返回-1
?

打开文件的方式(flags的值)?

?访问权限(mode的值)

?实例代码

#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(“打开文件失败\n”);
		exit(-1);
	}
	else
	{
		perror(“打开文件成功\n”); 
	}
	close(outfd); //关闭文件描述符
}

6、close系统调用?

作用:为了重新利用文件描述符,用close()系统调用释放打开的文件描述符

函数原型:int close(int fd);

参数:
?? ?fd :要关闭的文件的文件描述符
返回值:
?? ?成功返回0,出错返回-1并设置errno

7、read系统调用?

?作用:一旦有了与一个打开文件描述相连的文件描述符,只要该文件是用O_RDONLY或O_RDWR标志打开的,就可以用read()系统调用从该文件中读取字节

函数原型:int read(int fd, void *buf, size_t nbytes);

参数:

  • ?? ?fd :想要读的文件的文件描述符
  • ?? ?buf: ?指向内存块的指针,从文件中读取来的字节放到这个内存块中
  • ?? ?nbytes: 从该文件复制到buf中的字节个数

返回值:

成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0
?

8write系统调用?

作用:用write()系统调用将数据写到一个文件中

函数原型:int write(int fd,void *buf,size_t nbytes);

参数:

  • ?? ?fd :要写入的文件的文件描述符
  • ?? ?buf: ?指向内存块的指针,从这个内存块中读取数据写入到文件中
  • ?? ?nbytes: 要写入文件的字节个数

返回值:

成功返回写入的字节数,出错返回-1并设置errno
?

示例代码?

#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
void main()
	int outfd = 0, r_size = 0;
	char buf[ ] = "Hello hml!!";
	fd = open("test",O_WONLY | O_TRUNC | O_CREAT,S_IRWXU);
	if(outfd>0)
	{
		r_size = write(outfd,buf,sizeof(buf));
		if(r_size>0)
		{
			printf("成功写入数据!");
		}	
		close(fd);		
	}
}

接下一篇文章,我们来学习其他的一些系统调用等等

Linux——设备管理及文件IO(二)

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 23:03:00  更:2022-03-10 23:03:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:24:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码