| |
|
开发:
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(一) |
一、引言
二、Linux中的设备管理1、设备无关性为了提高操作系统的可适应性和可扩展性,目前几乎所有的操作系统都实现了设备的独立性(Device Independence) Linux采用文件系统管理硬件设备,所有的设备都看成是特殊的文件(目录、套接字也可以是文件),从而将硬件设备的特性及管理细节对用户隐藏起来,实现设备无关性。 2、设备管理的特点
3、设备分类按设备信息交换单位来分:字符设备、块设备。 按设备属主关系:系统设备、用户设备。 按设备共享属性来分:独享设备、共享设备(打印机,U盘)。 ?4、Linux设备操作设备或文件操作两种方式:用户编程接口 API、系统调用。 三、系统调用系统调用是操作系统提供给用户的一组“特殊”接口。 系统调用并非直接和程序员或系统管理员直接打交道,而是通过软中断的方式向内核提交请求,从而获取内核函数的服务入口(系统调用表)。 系统调用让系统从用户态进入内核态内运行,运行后将结果返回给应用程序(内核态–>用用户态)。 1、系统调用和系统API等区别①系统API ②系统命令 2、函数库调用与系统调用
|
函数库调用 | 系统调用 |
在所有啊ANSIC编译器版本中,C库函数是相同的 | 各个操作系统的系统调用是不同的 |
它调用函数库中的一段程序(或函数) | 它调用系统内核的服务 |
与用户程序相联系 | 是操作系统的一个入口函数 |
在用户地址空间执行 | 在内核地址空间执行 |
它的运行时间属于“用户时间” | 它的运行时间属于“系统”时间 |
属于过程调用,调用开销较小 | 需要在用户空间和内核上下文环境间切换,开销较大 |
在C函数库libc中大约300个函数 | 在UNIX中大约有90个系统调用 |
典型的C函数库调用:system fprintf malloc | 典型的系统调用:chdir fork write br |
每个进程PCB(进程控制块)结构中有文件描述符指针,指向files_struct的文件描述符表,记录每个进程打开的文件列表。
系统内核不允许应用程序访问进程的文件描述符表,只返回这些结构的索引即文件描述符ID(File Description)给应用程序。
Linux系统中,应用程序通过这些文件描述符来实现让内核对文件的访问每个进程能够访问的文件描述符是有限制的,通过ulimit –n可以查看。
特殊文件描述符号
- 0? ?STDIN_FILENO ?标准输入流
- 1? ?STDOUT_FILENO?? ?标准输出流
- 2? ?STDERR_FILENO 标准错误流
每个进程被加载后,默认打开0,1,2这三个文件描述符。
有几种方法可以获得允许访问文件的文件描述符。最常用的是使用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); //关闭文件描述符
}
作用:为了重新利用文件描述符,用close()系统调用释放打开的文件描述符
函数原型:int close(int fd);
参数:
?? ?fd :要关闭的文件的文件描述符
返回值:
?? ?成功返回0,出错返回-1并设置errno
?作用:一旦有了与一个打开文件描述相连的文件描述符,只要该文件是用O_RDONLY或O_RDWR标志打开的,就可以用read()系统调用从该文件中读取字节
函数原型:int read(int fd, void *buf, size_t nbytes);
参数:
- ?? ?fd :想要读的文件的文件描述符
- ?? ?buf: ?指向内存块的指针,从文件中读取来的字节放到这个内存块中
- ?? ?nbytes: 从该文件复制到buf中的字节个数
返回值:
成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0
?
作用:用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);
}
}
接下一篇文章,我们来学习其他的一些系统调用等等
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |