linux内核编程学习——草稿
第一章
1.1 文件IO
c标准函数与系统函数的区别 FILE文件类型是一个结构体类型,包括文件描述符(inode)、位置指针(f_pos)、缓冲器(buffer)(8192byte)。
c标准文件函数都是带有缓冲区的,系统函数是不带缓冲区的。对于网络编程是不能有缓冲区的。
c标准函数->应用层API->内核层API->驱动函数->设备
写一个hello到文件中:用c标准函数fopen和fwrite将hello写入文件,这之间首先将hello写入C标准缓冲区然后调用应用层API的write将hello写入内核缓冲区然后依据系统的守护进程中定义的时间或者体积量调用内核层函数sys_write在调用驱动层将hello写入文件。
1.2 PCB(进程控制块)概念
PCB是一个task_struct结构体,里面包含了进程的所有信息。
每个PCB(taskstruct)中都有一个filestruct结构体指针,此指针指向的是文件描述符表,即文件的地址。
1.3 open/close
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
int fd;
if (argc < 2) {
printf("./app filename\n");
exit(1);
}
fd = open(argv[1],O_CREAT,0644);
printf("fd = %d\n", fd);
close(fd);
return 0;
}
open() 主要用到的属性:
O_CREAT O_RDWR O_RDONLY O_WRONLY O_APPEND
fd=open(argv[1], O_CREAT | O_RDWR | O_EXCL, 0644);
1.4 最大打开文件个数
一个进程默认最大打开文件个数1021个文件。
int main(int argc,char *argv[])
{
char name[1024];
int i = 0;
int fd;
while( 1 ) {
sprintf(name, "file%d", ++i);
fd = open(name, O_CREAT, 0777);
if(-1 == fd) exit(1);
printf("%d\n", i);
}
}
cat /proc/sys/fs/file-max 查看当前电脑能承受的最大打开文件个数
ulimit -n 4096 修改默认设置最大打开文件个数为4096个
ulimit -a 查看当前设置的能打开文件的最大个数
1.5 read/write
#include <unistd.h>
ssize_t read(int fd,void *buf, size_t count);
/*ssize_t 有符号整形类型 size_t 无符号整形类型*/
读成功返回读到的字节个数,读完返回0,读失败返回-1
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define SIZE 8192
int main(int argc, char *argv[])
{
char buf[SIZE];
int fd_src, fd_dest, len;
if(argc < 3){
printf("./mycp src dest\n");
exit(1);
}
fd_src = open(argv[1], O_RDONLY);
fd_dest = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, 0644);
while( len = read ( fd_src, buf, sizeof(buf)) >0 )
write (fd_dest, buf, len);
close(fd_src);
close(fd_dest);
}
1.6 阻塞与非阻塞
1.6.1 阻塞
一个进程默认打开3个文件描述符
STDIN_FILENO 0 相当于stdin
STDOUT_FILENO 1 相当于stdout
STDERR_FILENO 3 相当于stderr
#include <sys/types.h>
#include
int main(int argc,char *argv[])
{
char buf[1024];
int len;
len = read(STDIN_FILENO, buf, sizeof(buf));//阻塞
if(len<0){
exit(1);
}
write(STDOUT_FILENO, buf, len);
return 0;
}
读磁盘上常规文件一般不会出现阻塞,不管读多少字节,read一定会有限时间内返回,从终端设备或网络设备上读一般会发生阻塞。
当一个进程处于阻塞时,这个进程会被置于SLEEP状态。在linux下用S+表示SLEEP状态。
1.6.2 非阻塞
终端的概念:tty是linux的终端文件,当开启新的窗口时会将tty指向新开的窗口。
open() creat()返回新的文件描述符,如果失败返回-1,同时将errno置相应的错误值
perro()函数根据errno的错误号,打印相应的信息
errno 全局标量 错误原因标志位
strerror()是perro下层的函数(个人理解)
char *strerror(int errnum)
1.7 lseek
lseek()函数类似于fseek()函数,fseek()函数有两个作用:当前读写位置指针和扩展文件。
int fseek(FILE *stream, long offset, int whence)
off_t lseek(int fd, off_t offset, int whence) //fseek的底层函数
扩展文件时,lseek(fd, 0x1000, SEEK_SET),fd是一个空文件描述符,扩展后不会增加,只有在write后才能增加,增加的内容随意。(扩展一个文件大小,一定要有一次写操作)
lseek()可以扩展一个文件,可以得到一个文件的大小。
1.8 fcntl
fcntl()获取一个文件的访问控制属性(FGETFL)和设置一个文件的访问控制属性(FSETFL)
1.9 ioctl
uart_write
uart_read
uart_ioctl
ioctl获取和设置文件的物理特性
fcntl获取和设置文件的访问特性
应用层write调用系统层syswrite调用驱动层uartwrite
第二章
对于ext2文件系统,每个分区组都有特定的格式:
每个block是4096Bytes,每个block占8个磁盘扇区,每个磁盘扇区是512Bytes,每个block也就是32768bit位。对于每个分区将被分为若干个block,第一个block是一个boot block是产商约定的,第二块是超级block记录了整个分区的情况,之后是GDT块描述表,记录了它之后的一些块(指的是描述性的块,不是数据块)的位置,再之后是块位图(block bit map),记录了那些块还是空闲的,之后是inode bit map,记录的各个文件的起始位置,之后是inode table,记录的对应inode节点文件的文件属性和块指针,之后才是数据块。。。一个文件要想存入系统,需要首先根据GDT找到inode bit map申请一个inode节点数,然后对应inodetable写入描述信息,之后根据block bit map看哪些块是空闲的写入inode table的块指针中,之后写入相应的数据,完成存储。
重点说明(1)inode table中的块指针,默认用一个块记录指针,也就是4096Bytes记录,也就是4096/4=1024个指针,一般来说1024个指针只能存储1024*4096(Bytes)/1024(M)/1024(G)=4G不能满足大文件的存储,因此设计1024个指针的最后三个指针为一级,二级,三级指针,分别指针另外的块,这样就被大大的增加了指针的数量。(2)从第二块开始被分为若干组,每个组的大小由block bit map中字节位数大小决定,block bit map的字节位数由block的大小决定,block的大小可以人为设定。
linux内核编程学习——草稿的更多相关文章
- linux内核数据结构学习总结
目录 . 进程相关数据结构 ) struct task_struct ) struct cred ) struct pid_link ) struct pid ) struct signal_stru ...
- Linux内核编程规范与代码风格
source: https://www.kernel.org/doc/html/latest/process/coding-style.html translated by trav, travmym ...
- Linux 系统编程 学习:00-有关概念
Linux 系统编程 学习:00-有关概念 背景 系统编程其实就是利用系统中被支持的调度API进行开发的一个过程. 从这一讲开始,我们来介绍有关Linux 系统编程的学习. 知识 在进行Linux系统 ...
- Linux 系统编程 学习:01-进程的有关概念 与 创建、回收
Linux 系统编程 学习:01-进程的有关概念 与 创建.回收 背景 上一讲介绍了有关系统编程的概念.这一讲,我们针对 进程 开展学习. 概念 进程的身份证(PID) 每一个进程都有一个唯一的身份证 ...
- Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道
Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道 背景 上一讲我们介绍了创建子进程的方式.我们都知道,创建子进程是为了与父进程协作(或者是为了执行新的程序,参考 Linux ...
- Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号
Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道 ...
- Linux 系统编程 学习:04-进程间通信2:System V IPC(1)
Linux 系统编程 学习:04-进程间通信2:System V IPC(1) 背景 上一讲 进程间通信:Unix IPC-信号中,我们介绍了Unix IPC中有关信号的概念,以及如何使用. IPC的 ...
- Linux 系统编程 学习:05-进程间通信2:System V IPC(2)
Linux 系统编程 学习:05-进程间通信2:System V IPC(2) 背景 上一讲 进程间通信:System V IPC(1)中,我们介绍了System IPC中有关消息队列.共享内存的概念 ...
- Linux 系统编程 学习:06-基于socket的网络编程1:有关概念
Linux 系统编程 学习:006-基于socket的网络编程1:有关概念 背景 上一讲 进程间通信:System V IPC(2)中,我们介绍了System IPC中关于信号量的概念,以及如何使用. ...
随机推荐
- android ListView详解
转自:http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html 在android开发中ListView是比较常用的组件,它以列表的形式展 ...
- C++ 学习资料搜寻与学习(第一期)(未完待续)
一.图形图像类 [Visual C++]vs2008/2005正确打开vs2010所创建项目的几种方法 jlins 2012-04-12 14:38 [Visual C++]关于无法打开包括文件:“S ...
- Java HashMap存储问题
public static boolean isIsomorphic(String s, String t) { Map map1 = new HashMap<>(); Map map2 ...
- class0513(html基础加强2)
使用VS创建网页 新建Web项目(新建→ASP.Net Web应用程序),新建html页面(添加→新建项→Web→HTML页) 查看页面的方式: 切换到“设计”视图,可以在这里查看初步的预览效果,不是 ...
- codeforce 600A - Extract Numbers
学习string #include <bits/stdc++.h> #define eps 1e-8 #define M_PI 3.141592653589793 ; using name ...
- HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口
1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...
- 最近升级了一下小老婆(8核 2x8G DDR3 128G SSD)
晒图(笔者的硬件知识属于小白级别, 且看且参考吧): 另外优化一下休眠&虚拟内存功能节省SSD空间: 1. 台式机, 休眠功能基本没必要, 果断关掉 C:\Windows\system32&g ...
- 曝光卖假币的店铺和旺旺ID
1:店铺名称:九玖邮币 掌柜ID:九玖邮币[此人较贼,价格只比我们低一点,图用的不太清晰的,或者直接用真品图,而且卖假币卖到2钻了,很多人上当了.]1.5 店铺名称:聚鑫钱币 掌柜ID:聚鑫钱币 [1 ...
- 独树一帜的字符串匹配算法——RK算法
参加了雅虎2015校招,笔试成绩还不错,谁知初面第一题就被问了个字符串匹配,要求不能使用KMP,但要和KMP一样优,当时瞬间就呵呵了.后经过面试官的一再提示,也还是没有成功在面试现场写得.现将该算法记 ...
- STC12C5A60S2片内存储器介绍
STC12C5A60S2内部集成RAM 1280字节,其中 内部RAM(data):256 Byte 内部扩展RAM(xdata):1024 Byte 支持片外扩展RAM: 64kB STC12C5A ...