Linux信号处理机制

在Linux中,信号是进程间通讯的一种方式,它采用的是异步机制。当信号发送到某个进程中时,操作系统会中断该进程的正常流程,并进入相应的信号处理函数执行操作,完成后再回到中断的地方继续执行。

需要说明的是,信号只是用于通知进程发生了某个事件,除了信号本身的信息之外,并不具备传递用户数据的功能。

1 信号的响应动作

每个信号都有自己的响应动作,当接收到信号时,进程会根据信号的响应动作执行相应的操作,信号的响应动作有以下几种:

  • 中止进程(Term)
  • 忽略信号(Ign)
  • 中止进程并保存内存信息(Core)
  • 停止进程(Stop)
  • 继续运行进程(Cont)

用户可以通过signalsigaction函数修改信号的响应动作(也就是常说的“注册信号”,在文章的后面会举例说明)。另外,在多线程中,各线程的信号响应动作都是相同的,不能对某个线程设置独立的响应动作。

2 信号类型

Linux支持的信号类型可以参考下面给出的列表。

2.1 在POSIX.1-1990标准中的信号列表

信号 动作 说明 …

函数调用栈的获取原理分析

上一篇文章《在Linux程序中输出函数调用栈》,讲述了在Linux中如何利用backtrace获取调用栈,本篇文章主要介绍一下获取函数调用栈的原理,并给出相应的实现方式。

要了解调用栈,首先需要了解函数的调用过程,下面用一段代码作为例子:

#include <stdio.h>

int add(int a, int b) {
    int result = 0;

    result = a + b;

    return result;
}

int main(int argc, char *argv[]) {
    int result = 0;

    result = add(1, 2);

    printf("result = %d \r\n", result);

    return 0;
}

使用gcc编译,然后gdb反汇编main函数,看看它是如何调用add函数的:

(gdb …

在Linux程序中输出函数调用栈

程序发生异常时,将函数的调用栈打印出来,可以大大提高定位效率。

Linux中提供了三个函数用来获取调用栈:

/* 获取函数调用栈 */
int backtrace(void **buffer, int size);

/* 将调用栈中的函数地址转化为函数名称 并返回一个字符串数组 */
char **backtrace_symbols(void *const *buffer, int size);

/* 将调用栈中的函数地址转化为函数名称 并将其定入到文件中 */
void backtrace_symbols_fd(void *const *buffer, int size, int fd);

示例代码:

#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>

/* 打印调用栈的最大深度 */
#define DUMP_STACK_DEPTH_MAX 16

/* 打印调用栈函数 */
void dump_trace() {
    void *stack_trace …

TP-WR703n安装OpenWRT记录

1 安装OpenWRT

1.1 下载并刷新固件

如果以前没刷过OpenWRT,需要升级factory固件,点击这里下载

如果之前已经安装过了OpenWRT,则直接更新sysupgrade固件即可,点击这里下载

注意升级的时候要将原配置删除,避免配置文件互相影响,固件刷新完成后,路由器会自动重启。

1.2 登陆路由器

OpenWRT主线固件的无线信号是默认关闭的,这个时候需要找跟网线将电脑和路由器连接上,然后将电脑的IP地址设置为静态的"192.168.1.100",然后用Telnet访问"192.168.1.1",正确的情况下,会看到如下界面: First Login

1.3 打开无线信号

编辑"/etc/config/wireless"文件,将"option disabled 1"这一行注掉,或者直接删除。

config wifi-device radio0
    option …



配置 Cisco Catalyst 3560 交换机端口镜像

假设要将19和27号端口的数据镜像到2号端口,按如下操作进行:

1) 通过串口登陆到交换机,其中参数设置为:速率9600bps,8位数据位,1位停止位,无奇偶校验,无流量控制。

2) 交换机上电自检然后登入后出现命令提示符:

Switch>

3) 依次进入特权模式和全局模式,输入如下命令:

Switch>enable
Password:
Switch#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
Switch(config)#

4) 在新session中,将端口19和27设置为被监听端口(source),2号端口设置为监听端口(destination),命令如下:

Switch(config)#monitor session 1 source interface Fa0/19 …

C#获取XML文件指定节点的数据

实例说明会更清楚些,假设有如下XML文件:

``` xml message_hutaow.xml <?xml version="1.0" encoding="UTF-8"?>        20080502            

192.168.0.1
      hutaow                 
192.168.0.19
    
  

现在要读取消息源IP地址(192.168.0.1)和目的IP地址(192.168.0.19)

<!-- more -->

根据上面XML文件的结构,查找路径为"/Message/Head/Source/Address""/Message/Head/Target/Address",需要用到 …

Snort安装IDMEF插件

Snort作为一款开源的入侵检测系统,可以与其它各种网络设备连接协同工作,其中IDMEF插件可以实现设备之间报警信息的共享,在安装该插件时,需要注意以下几个问题:

  1. IDMEF插件依赖于libidmeflibxml2libntp库,所以在安装Snort之前,需要首先安装这三个库。

  2. 配置Snort时,需要加上"--enable-idmef"参数,如下所示:

./configure --enable-idmef
make
make install

入侵检测与响应系统的信息共享

引言

入侵检测系统(IDS)与其它系统(如防火墙)交互过程中,需要遵循一定的规范和协议,然而生产IDS的各个厂家的报警日志及数据格式均有所区别,所以在不同设备之间交互会遇到很多麻烦。早先知道的是CheckPoint提出的OPSec协议和天融信提出的TOPSec协议,凡是遵循这两个协议的网络安全设备均可与相应的IDS进行交互,协同防护网络安全。在2007年,IETF针对这种交互情况形成了四份相关文档,分为三个部分,分别是隧道轮廓(RFC3620 - The TUNNEL Profile)、入侵检测消息交换格式和要求(RFC4765 - IDMEF, RFC4766 - IDMER)、入侵检测交换协议(RFC4767 - IDXP)。

值得注意的是,IETF规定IDS对其它设备交互的方式采用XML格式存储和传输,和SOAP似乎有些相似,XML跨平台跨语言结构清晰等优点使它的应用范围越来越广,几乎达到了无处不用XML的程度。

1 入侵检测消息交互过程

1.1 建立连接

使用IDXP传输数据的入侵检测实体被称为IDXP对等体。对等体只能成对出现,这些对等体通过BEEP会话中的一个或多个BEEP信道进行数据传输。对等体可能是管理器或分析器。

在分析器和管理器之间很可能是多对多的关系。即一个分析器可以和多个管理器通信,同样,一个管理器也可以和多个分析器通信;在不同的管理器之间也可以是多对多的关系。所以,一个管理器可以通过多个中间管理器接收大量的来自分析器的报警信息。但是 …