LINUXQQ

八月 26, 2009

信号屏蔽字

类归于: 乱7八糟 — 标签: — admin @ 4:06 下午

 

四、信号屏蔽字:

有时候我们希望进程正确的执行,而不想进程受到信号的影响,比如我们希望上面那个程序在1秒钟之后不结束。这个时候我们就要进行信号的操作了。

信号操作最常用的方法是信号屏蔽。信号屏蔽要用到下面的几个函数。

sigemptysetsigfillsetsigaddsetsigdelsetsigismembersigprocmask。下面对他们分别进行讲解。

 

8

名称:

sigemptyset/sigfillset/sigaddset/sigdelset/sigismember

功能

处理信号集

头文件

#include <signal.h>

函数原形:

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set,int signum);

int sigdelset(sigset_t *set,int signum);

int sigismember(const sigset_t *set,int signum);

参数:

set 信号集

signum 信号

返回值:

若成功返回0,若出错返回-1

若真返回1,若假返回0,若出错返回-1 sigismember

      

 

 

 

 

 

 

 

 

 我们需要有一个能表示多个信号—信号集的数据类型。我们将在诸如sigprocmask之类的函数中使用这种数据类型,以便告诉内核不允许发生该信号集中的信号。上面的5个函数可以对信号集进行处理。

函数sigemptyset 初始化由set指向的信号集,清除其中所有信号。函数sigfillset初始化由set指向的信号集,使其包含所有信号。所以信号在使用信号集前,要对信号集调用sigemptysetsigfillset一次。

函数sigaddset 将一个信号添加到现有集中,sigdelset则从信号集中删除一个信号。对所有以信号集作为参数的函数,我们总是以信号集地址作为其传送的参数。

       sigismember查询信号是否在信号集合之中。

下面的例子:

/*10_7.c*/

#include <stdio.h>

#include <signal.h>

 

main()

{

sigset_t *set;

set=(sigset_t*)malloc(sizeof(set));

 

sigemptyset(set);/*初始化信号集*/

sigaddset(set,SIGUSR1);/*添加信号SIGUSR1到信号集中*/

sigaddset(set,SIGINT);/*添加信号SIGUSR2到信号集中*/

 

if((sigismember(set,SIGUSR1))==1)/*测试信号SIGUSR1是否在信号集中*/

    printf(“SIGUSR1\n”);

if((sigismember(set,SIGUSR2))==1)

    printf(“SIGUSR2\n”);

if((sigismember(set,SIGINT))==1)

    printf(“SIGINT\n”);

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

下面是执行结果:

# ./10_7

SIGUSR1

SIGINT

程序先初始化信号集,清除其中所有信号,然后把SIGUSR1SIGINT添加到信号集中,然后测试SIGUSR1SIGUSR2SIGINT信号是否在信号集中。因为SIGUSR2不在信号集中,所以程序并不打印SIGUSR2

 

9

名称:

sigprocmask

功能

检测或更改信号屏蔽字

头文件

#include <signal.h>

函数原形

int sigprocmask(int how,const sigsett_t *set,sigset_t *oldset);

参数:

how  操作方式

set   信号集

oldest

返回值:

若成功返回0,若出错返回-1

 

 

 

 

 

 

 

 

 

 

 

 

每个进程都有一个用来描述哪些信号递送到进程时将被阻塞的信号集,该信号集中的所有信号在递送到进程后都将被阻塞。

sigprocmask是最为关键的一个函数。在使用之前要先设置好信号集合set。这个函数的作用是将指定的信号集合set加入到进程的信号阻塞集合之中去,如果提供了oldset那么当前的进程信号阻塞集合将会保存在oldset里面。参数how决定函数的操作方式。

SIG_BLOCK:增加一个信号集合到当前进程的阻塞集合之中。

SIG_UNBLOCK:从当前的阻塞集合之中删除一个信号集合。

SIG_SETMASK:将当前的信号集合设置为信号阻塞集合。

 

我们把10_7.c稍微修改一下,看看sigprocmask函数的功能。

/*10_8.c*/

#include <stdio.h>

#include <signal.h>

 

main()

{

sigset_t *set;

set=(sigset_t*)malloc(sizeof(set));

 

sigemptyset(set);/*定义信号集set*/

sigaddset(set,SIGINT);/*把信号SIGINT添加到信号集中*/

sigprocmask(SIG_SETMASK,set,NULL);/*set设置为信号阻塞集合*/

wile(1);/*死循环*/

}

程序先定义信号集set,然后把信号SIGINT添加到set信号集中,最后把set设置为信号阻塞集合。当我们运行程序时,进程进入死循环。我们按“ctrl+c”系统并没有中断程序,因为我们已经把SIGINT信号屏蔽掉了。我们可以按”ctrl+z”来结束程序。

sigeprocmask函数通常和sigemptyset/sigfillset/sigaddset/sigdelset/sigismember函数配合使用,主要有两种用途:

1.我们不希望某些不太重要的信号来影响我们的进程,我们就可以把这些信号添加到信号屏蔽集中。使它们不打扰进程的执行。

2.如果系统现在很忙,没有时间及时相应信号,进程可以先把信号阻塞掉,等系统有空闲时间在去相应,这也保证了信号的可靠性。下面的函数可以做到这一点。

 

10

名称:

sigpending

功能:

返回信号集

头文件:

#include <signal.h>

函数原形:

int sigpending(sigset_t *set);

参数:

 

返回值:

若成功返回0,若出错返回-1

 

 

 

 

 

 

 

 

 

我们要注意的是,阻塞信号并不是丢弃信号,它们被保存在一个进程的信号阻塞队列里,sigpending可以获得当前已递送到进程,却被阻塞的所有信号,在set指向的信号集中返回这些信号。

 

下面是一个例子:

/*10_9.c*/

#include <stdio.h>

#include <signal.h>

#include <stdlib.h>

 

int main(void)

{

sigset_t newmask,oldmask,pendmask;

 

sigemptyset(&newmask);  /*初始化信号集*/

sigaddset(&newmask,SIGINT);  /*添加信号SIGINT到信号集*/

if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0)  /*信号集newmask设置为阻塞信号集*/

    perror(“error”);

sleep(5);

if(sigpending(&pendmask)<0)  /*把当前已递送到进程,却被阻塞的信号保存到进程的信号阻塞队列里*/

    perror(“error”);

if(sigismember(&pendmask,SIGINT))  /*检测进程阻塞队列里是否有SIGINT信号*/

    printf(“\nSIGINT pending\n”);

 

exit(0);

}

 

程序开始运行,如果我们在5秒钟内按”ctrl+c”,SIGINT信号会被传递到进程,但是由于进程设置了信号阻塞集,信号SIGINT在这个集合中,所有这个信号被阻塞。并由sigpend保存到进程的信号阻塞队列pendmask.然后我们用sigismember检测SIGINT是否在信号阻塞队列pendmask里。

 

八月 14, 2009

dlink-3026 基本配置手册

类归于: 乱7八糟 — 标签: — admin @ 2:19 下午

基本配置方法:

网络交换机的的配置说明书Show命令可以查看交换机的各项的配置(交换机无法查看整体的当前和保存的配置信息)
Create
命令可以创建交换的信息
Config
命令可d以对这些参数进行配置
Delete
命令可以删除所配制的参数
Reboot
命令对交换机进行重新启动

Save命令保存交换机的配置信息的修改
Reset
命令清空配置信息
reset system
不仅清空运行时配置,还将把曾经保存过的配置全部清空
reset config
仅清空运行时配置

Create account [admin|user]<username>  创建adminuser级别的用户,回车输入两次密码创建输入为空密码
Create account <username>
修改已创建的username用户,回车输入旧密码,在输入两次新密码Show account 可以看到你所创建的用户
Show switch   
可以查看交换机的信息
Show iproute   
查看路由表
Show vlan      
查看VLAN条目
[enable|disable] telnet 23            
此命令开启删除telnet功能
enable mac_notification               
默认是关闭MAC地址通告的
脚本:

create account admin admin    //创建管理员用户,用户名admin//

admin                         //password :admin//

admin                        //再确认password :admin//

create vlan vlan1242 tag 1242//创建VLAN1242,标记为1242//

 

config vlan default delete 1-24//删除默认1-24口默认VLAN//

config vlan vlan1242 add untagged 2-24//配置2-24口为VLAN1242,不打标记 //

config vlan vlan1242 add tagged 1 //配置1口为VLAN1242,打标记 //         

config ipif System ipaddress 192.168.1.2/255.255.255.0 vlan vlan1242 state enable

//VLAN1242上配置IP地址192.168.1.2//   

create iproute default 192.168.1.1//配置缺省网关 //

config traffic_segmentation 2-24 forward_list 1

//配置流量分割,端口隔离 //

create snmp host 117.131.2.227 v2c public

create snmp host 117.131.2.227 v2c private

//配置网管地址,主要用于告警的上发 //

save

   交换机支持TELNET的功能,配置完AP和交换机后,在超级终端ping AP的地址,来测试一下AP是否正常。再ping 网关确认移动的传输是否正常。

配置端口限速1M

config bandwidth_control 2-24 rx_rate 1024

config bandwidth_control 2-24 tx_rate 1024

WordPress 所驱动