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中关于信号量的概念,以及如何使用. ...
随机推荐
- onAttachedToWindow () 和 onDetachedFromWindow () ; 以及更新视图的函数ondraw() 和dispatchdraw()的区别
protected void onAttachedToWindow() This is called when the view is attached to a window. At this po ...
- 查询Table name, Column name, 拼接执行sql文本, 游标, 存储过程, 临时表
018_Proc_UpdateTranslations.sql: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO if (exists (select ...
- microsoft的罗马帝国——浪潮之巅
其实开始读微软的这篇已经比较久了,从来学校的前一天晚上等车的时候就开始读了,直到今天才看完.嗯,微软的确是个帝国. 那就从头开始讲把,关于帝国的传奇都是比较长的故事呢.至于我的叙述水平和我的知识水平都 ...
- uva 12304
题意:要求解答6个关于圆的问题. 1.给出三角形坐标求外接圆 2.给出三角形坐标求内切圆 3.给出一个圆心和半径已知的圆,求过点(x,y)的所有和这个圆相切的直线 4.求所有和已知直线相切的过定点(x ...
- 50道经典的JAVA编程题 (6-10)
50道经典的JAVA编程题 (6-10),今晚做了10道了,累死了...感觉难度不是很大,就是不知道是不是最好的实现方法啊!希望大神们能给指点哈... [程序6]GCDAndLCM.java 题目:输 ...
- HW6.18
public class Solution { public static void main(String[] args) { double[] array = {6.0, 4.4, 1.9, 2. ...
- POJ2389: 大数字乘法算法
2014-12-26 大数字乘法算法一般是采用模拟"小学生乘法演算过程”方法. 主要算法思想: 1. 乘数a第i)位与乘数b第j)位数字相乘,并将该乘积结果放到乘积结果数组product的第 ...
- Send email alert from Performance Monitor using PowerShell script (检测windows服务器的cpu 硬盘 服务等性能,发email的方法) -摘自网络
I have created an alert in Performance Monitor (Windows Server 2008 R2) that should be triggered whe ...
- SQL2008--SQL语句-存储过程-触发器-事务处理-基本语法-函数
环境 SQL2008 1.存储过程建立 库-可编程性-存储过程-右击“存储过程”-点击“新建存储过程” SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCRE ...
- flashback data archive (转)
闪回数据归档(Flashback Data Archive) 在Oracle 11g当中,对闪回技术再次进行了扩展,提供了一个全新的flashback方式,称之为闪回数据归档,本节我们将对闪回数据归档 ...