linux系统函数

1.Linux函数简述

  • Linux系统函数的用法必须结合Linux内核的工作原理 来理解,因为系统函数正是内核提供给应用程序的接口,而要理解内核的工作原理,必须熟练掌握C语言,因为内核也是用C语言写的。
  • 我们在描述内核工作原理时必然要用“指 针”、“结构体”、“链表”这些名词来组织语言,就像只有掌握了英语才能看懂英文书一样,只有学好了C语言才能看懂我描述的内核工作原理。

2.文件I/O

2.1-C标准库函数和系统函数的关系

2.2文件描述符

文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

一个进程默认打开3个文件描述符:

STDIN_FILENO 0
STDOUT_FILENO 1
STDERR_FILENO 2

标准输入(STDIN_FILENO)的文件描述符是 0
标准输出(STDOUT_FILENO )的文件描述符是 1
标准错误(STDERR_FILENO )的文件描述符是 2。

  • 新打开文件返回文件描述符表中未使用最小文件描述符。
  • 文件描述符的有效范围是0OPEN_MAX。一般来说,每个进程最多可以打开64个文件(0 — 63)。

2.3-task_struct结构体

  • 为了管理进程,操作系统必须对每个进程所做的事情进行清楚的描述,为此,操作系统使用数据结构来代表处理不同的实体,这个数据结构就是通常所说的进程控制块PCB)。
  • linux操作系统下这就是task_struct结构体 ,所属的头文件#include <sched.h>每个进程都会被分配一个task_struct结构,它包含了这个进程的所有信息

这个进程的主要信息:

  • 1、与进程相关的唯一标识符:区别正在执行的进程和其他进程

  • 2、状态:描述进程的状态,因为进程有阻塞、挂起、运行等好几个状态,所以都有个表示符来记录进程的执行状态。

  • 3、优先级:如果有好几个进程正在执行,就涉及到进程的执行的先后顺序,这和进程的优先级这个标识符有关。

  • 4、程序计数器:程序中即将被执行指令的下一条地址。

  • 5、内存指针:程序代码和进程相关数据的指针。

  • 6、上下文数据:进程执行时处理器的寄存器中的数据。

  • 7、I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

  • 8、记账信息:包括处理机的时间总和,记账号等等

2.4-files_struct结构体

  • files_struct结构体定义在include/linux/fs.h中定义。文件结构体代表一个打开的文件,系统中的每个打开的文件在内核空间都有一个关联的 files_struct
  • 它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。在内核创建和驱动源码中,files_struct的指针通常被命名为filefilp

2.5-文件描述符、task_struct结构体(PBC)、files_struct结构体三者关系

  • 文件描述符fd只是一个小整数,在open时产生。起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。·
  • 文件描述符的操作(如: open)返回的是一个文件描述符,内核会在每个进程空间中维护一个文件描述符表,所有打开的文件都将通过此表中的文件描述符来引用;而流(如: fopen)返回的是一个FILE结构指针, FILE结构是包含有文件描述符的,FILE结构函数可以看作是对fd直接操作的系统调用的封装, 它的优点是带有I/O缓存
  • 每个进程在PCB进程控制块中都保存着一份文件描述符表,文件描述符就是这个表的索引,文件描述表中每个表项都有一个指向已打开文件的指针,已打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体

    2.6-open函数
  • open函数有两种形式,一种带两个参数,一种带三个参数
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
返回值:成功返回新分配的文件描述符,出错返回-1并设置errno

pathname参数是要打开或创建的文件名,和fopen一样,pathname既可以是相对路径也可以是绝对路径flags参数有一系列常数值可供选择,可以同时选择多个常数用按位或运算符连接起来,所以这些常数的宏定义都以O_开头,表示or

flag参数选项:

必选项:以下三个常数中必须指定一个,且仅允许指定一个。

  • O_RDONLY 只读打开
  • O_WRONLY 只写打开
  • O_RDWR 可读可写打开

可选项:以下可选项可以同时指定0个或多个,和必选项按位或起来作为flags参数。可选项有很多, 这里只介绍一部分。

  • O_APPEND 表示追加。如果文件已有内容,这次打开文件所写的数据附加到文件的末尾 而不覆盖原来的内容。
  • O_CREAT 若此文件不存在则创建它。使用此选项时需要提供第三个参数mode,表示该 文件的访问权限。
  • O_EXCL 如果同时指定了O_CREAT,并且文件已存在,则出错返回。
  • O_TRUNC 如果文件已存在,并且以只写或可读可写方式打开,则将其长度截断(Trun- cate)为0字节。
  • O_NONBLOCK对于设备文件,以O_NONBLOCK方式打开可以做非阻塞I/O(Nonblock I/ O)

2.7-close函数
close函数关闭一个已打开的文件:

#include <unistd.h> int close(int fd);
返回值:成功返回0,出错返回-1并设置errno

参数fd是要关闭的文件描述符。需要说明的是,当一个进程终止时,内核对该进程所有尚未关闭的文件描述符调用close关闭,所以即使用户程序不调用close,在终止时内核也会 自动关闭它打开的所有文件。但是对于一个长年累月运行的程序(比如网络服务器),打开 的文件描述符一定要记得关闭,否则随着打开的文件越来越多,会占用大量文件描述符和系统资源。

参考文章:
https://www.cnblogs.com/pluslius/p/10088929.html
https://blog.csdn.net/daboluo521/article/details/79598281
https://www.cnblogs.com/hanxiaoyu/p/5677677.html

Linux-linux系统函数相关推荐

  1. Linux通过系统函数设置系统时间

    一.描述 通过settimeofday()函数来设置系统时间,这个函数设置的精度可以精确到微秒. #include <time.h>int settimeofday(const struc ...

  2. Linux下系统函数open,read,write,lseek函数

    一.简介 1. open 头文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> 定 ...

  3. linux 查看系统函数库,教你在Linux操作系统中如何创建函数库

    函数库分为静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存 ...

  4. Linux系统函数之IO函数

    技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.标准C库IO函数工作流程 IO缓冲区的作用? 大部分硬盘都是机械硬盘,读取寻道时间 ...

  5. linux时间调整为dst,Linux上系统时间函数、DST等相关有关问题总结

    Linux下系统时间函数.DST等相关问题总结 1. 内核中时间的基本类型: 在Linux内核中,常见的时间类型有以下两种:系统时间(system time)和实时时间(real time),其实,方 ...

  6. Linux命令【四】文件+虚拟内存+常用系统函数

    File*其实是一个结构体 文件描述符FD:索引到对应的磁盘文件 文件读写位置指针FP_POS,如果同时读写需要注意文件指针的位置 I/O缓冲区BUFFER:保存内存指针,默认大小是8kb,用于减小我 ...

  7. Linux学习笔记——系统函数IO

    文章目录 标准C库IO函数工作流程 标准C库函数与Linux系统函数之间的关系 虚拟地址空间 系统函数IO open read 与 write lseek 标准C库IO函数工作流程 用 fopen 打 ...

  8. Linux 系统函数

    Linux 系统函数 可以使用 man 2 函数名 查看 系统函数 也可以在 文件内 使用 2+ shift +k 进入指定函数 (前提是光标停在指定函数上) open 函数 int open(con ...

  9. Linux系统编程1——系统函数

    文章目录 前言 一.C标准函数与系统函数的区别 1.什么是系统调用 2.文件描述符 3.相关函数 3.1 open函数 3.2 close函数 3.3 read函数 3.4 write函数 3.5 l ...

  10. linux 系统函数调用脚本文件,Linux系统调用fsync函数详解

    Linux系统调用fsync函数详解 发布时间:2013-11-14 19:55:10   作者:佚名   我要评论 Linux fsync函数主要用于将同步内存中所有已修改的文件数据到储存设备,多用 ...

最新文章

  1. bzoj 3232 圈地游戏——0/1分数规划(或网络流)
  2. 【NOIP2013模拟联考6】选课(select)
  3. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 接线过程
  4. 华为路由器时间同步_4G网络变WIFI,华为4G路由2 Pro让上网变得更简单
  5. SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对照注解方式的优缺点)...
  6. 15.Object Manager
  7. MyBatis中出现Mapped Statements collection does not contain value 问题
  8. python继电器控制
  9. configure: error: Package requirements (oniguruma) were not met
  10. 7-2 寻找大富翁 (34 分)
  11. idea调试源代码c语言,IDEA阅读spring源码并调试
  12. 冬天洗衣不动手,这几款智慧洗衣机可以帮到你
  13. 无线路由器常用的五种工作模式详细介绍
  14. 关于烛光斧影——赵光义是否谋杀赵匡胤,是否合法继位
  15. 论人工智能与软件工程的关系
  16. GNSS算法相关开源代码(含多传感器融合相关项目)
  17. win8经典开始菜单计算机,玩转Win8.1开始菜单将那个经典的“老菜单”恢复回来...
  18. Notification Volume Control and Optimization System at Pinterest 小记
  19. 施耐德软起故障php,施耐德软启动器排除故障的具体措施和方法
  20. 软工第二次作业——软件案例分析

热门文章

  1. 前端-element-ui
  2. Kernel源码笔记之调度:3.CFS
  3. Java基础学习之Servlet 运用学习
  4. 100ml干胶能带上地铁吗_定型喷雾可以带上地铁吗
  5. JNI入门学程之HelloWorld篇
  6. 学计算机当导演吗,学计算机8年 80岁老荣民当“导演”
  7. 用百度地图实现添加电子围栏并判断是否在范围内
  8. 【Lintcode】562. Backpack IV
  9. 绩效考核管理系统使用说明1
  10. 广告和游戏广告变现全面解析