信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式。在Linux系统中,根据POSIX标准扩展以后的信号机制,不权可以用来通知某进程发生了什么事件,还可以给进程传递数据。
一、信号的来源
信号的来源可以有很多种方式,按照产生条件的不同可以分为硬件和软件两种方式。
1、硬件方式
当用户在终端上按下某些键时,将产生信号。如按下<ctrl+C>组合键后将产生一个SIGINT信号。
硬件异常产生信号:除数为0、无效的存储访问等。这些事件通常由硬件(如CPU)检测到,并将其通知给Linux操作系统内核,然后内核生成相应的信号,并把信号发送给该事件发生时正在运行的程序。
2、软件方式
用户在终端下调用kill命令向进程发送任意信号。
进程调用kill或sigqueue函数发送信号。
当检测到某种软件条件已经具备时发出信号,如由alarm或settimer设置的定时器超时时将生成SIGALRM信号。
二、信号的种类
在Shel ......
通过阐述两个具有代表性的系统调用sys_open()和sys_read()来更好地理解VFS向具体文件系统提供的接口机制。在深入sys_open()和sys_read()之前,我们先概览下调用sys_read()的上下文。下图描述了从用户空间的read()调用到数据从磁盘读出的整个流程。当在用户应用程序调用文件I/O read()操作时,系统调用sys_read()被激发,sys_read()找到文件所在的具体文件系统,把控制权传给该文件系统,最后由具体文件系统与物理介质交互,从介质中读出数据。
(1)sys_open()
sys_open()系统调用打开或创建一个文件,成功返回该文件的文件描述符。sys_open函数调用关系图:
(2)sys_read()
sys_read()系统调用用于从已打开的文件读取数据。如read成功,则返回读到的字节数。如已到达文件的尾端,则返回0。
对文件进行读操作时,需要先打开它。由《linux VFS的数据结构》可知打开一个文件时,会在内存组装一个文件对象,希望对该文件执行的操作方法已 ......
以下步骤均为root登录状态下进行执行。
一、卸载JDK
Linux会自带JDK,如果不使用自带版本的话需要卸载。
1、卸载系统自带的jdk版本
查看自带的jdk
#rpm -qa | grep gcj
看到如下信息:
libgcj-4.1.2-44.el5
java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
使用rpm -e -nodeps 命令删除上面查找的内容:
#rpm -e -nodeps java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
2、卸载rpm安装的jkd版本
查看安装的jdk:
#rpm -qa|grep jdk
看到如下信息:
jdk-1.6.0_07-fcs
卸载:
#rpm -e -nodeps jdk-1.6.0_07-fcs
二、安装jdk
首先到sun官网下载安装包,下面是最新的,已经更新到6u17了
http://java.sun.com/javase/downloads/index.jsp
如果希望找以前的版本,到下面的地址可以找到
http://java.sun.com/products/archive/
有jdk-6u7-linux-i586-rpm.bin和jdk-6u7-linux-i586.bin两种版本
这两种版本有什么区别?其中的rpm代表什么意思?
bin是二进制包,而rpm是redhat package 就是红帽的标准安装包
区别就是rpm安装的时候给你自动配置,一般都是lib安装到/usr/lib bin安装到/usr/bin下边,就算不是,在/usr/bin下也要建立一个软连接。
而二进制包你可以手动配 ......
2.1 安装JDK
2.1.1 检查Linux自带JDK
命令:rpm –q jdk
如果安装强制卸载
查看已经安装的jdk:
# rpm -qa|grep jdk ← 查看jdk的信息或直接执行
#rpm -qa|grep jdk 卸载:
#rpm -e rpm包名(上面看到的)若存在依赖关系,先卸载上层的。
2.1.2 准备安装文件
从SUN网站上下载对应的JDK版本,并上传到安装目录
下载地址:http://java.sun.com/javase/downloads/5u22/jdk
根据Linux版本下载
2.1.3 安装JDK
1、设置文件执行权限,并运行安装程序:
2、安装过程输入“yes”,回车后继续安装
3、运行完毕后 会出现“jdk-1_5_0_22-linux-i586.rpm”这个文件
4、设置执行权限并运行安装文件,命令:chmod 775 *.rpm ;rpm –ivh *.rpm
5、JDK安装后的位置在/usr/java
2.1.4 配置 ......
由于windows中所用头文件"windows.h"在linux下不可用,故自己建立相关的头文件,定义bmp文件的存储结构及格式
代码如下:
/* linux_bmp.h*/
/*
* Copyright (c)2010 Chris Grant
*
* Win32 USER structures and API
*/
#include <iostream>
typedef struct tagBITMAPFILEHEADER{
unsigned short bfType; //2 此处需留意
unsigned long bfSize; //4 /* File size in bytes */&nb ......
Linux 内存管理 -- 线性空间与物理内存 收藏
上图反映了如下信息:
1、 进程的4G 线性空间被划分成三个部分:进程空间(0-3G)、内核直接映射空间(3G – high_memory)、内核动态映射空间(VMALLOC_START - VMALLOC_END)
2、 三个空间使用同一张页目录表,通过 CR3 可找到此页目录表。但不同的空间在页目录表中页对应不同的项,因此互相不冲突
3、 内核初始化以后,根据实际物理内存的大小,计算出 high_memory、VMALLOC_START、VMALLOC_END 的值。并为“内核直接映射”空间建立好映射关系,所有的物理内存都可以通过此空间进行访问。
4、 “进程空间”和“内核动态映射空间”的映射关系是动态建立的(通过缺页异常)
假设在有三个线性地址 addr1, addr2, addr3 ,分别属于三个线性空间,但是最终都映射到物理页面1:
1、 三个地址对应不同的页表和页表项
2、 但是页表项的高 20bit 肯定是1,表示物理页面的索引号是1
3、 同时,根据高 20 bit,可以从 mem_map[] 中找到对应的 struct page 结构,struct page 用于管理实际的物理页面(红线)
4、 从线性地址,根据页目录表,页表,可以找到物理地址
5、 Struct page 和物理 ......