深入理解Linux kernel(内核)中的signal函数
在Linux内核代码中,有一个信号处理绑定器函数signal,它到原型定义如下,通过man 2 signal可以查看其原型。
#include <signal.h>
typedef void (*sighandler_t)(int); (1)
sighandler_t signal(int signum,sighandler_t handler); (2)
第一句是包含头文件,第二句是类型定义,第三句才是signal函数到真正声明。扩展声明后,真正到声明为
void (*signal(int signum,void (*sighandler)(int)))(int); (3)
第(3)看起来比第(1)和(2)句更难理解,首先从(1)(2)下手。
(1)表示sighandler_t是自定义类型,它其实是一种函数指针类型,它指向到函数到形参为int,返回值为void。
(2)表示signal函数到形参有一个int型signum,以及一个sighandler_t型到形参handler,返回一个sighandler_t型到值,由(1)可以知道:sighandler_t是函数指针类型,所以signal到第二个形参是一个函数指针,并且signal函数返回一个函数指针。它们指向到函数类型都是具有一个int形参,返回为void到函数。
迷惑:对于signal函数,对于初学者来说,不仅是语法上到迷惑,还有应用上到迷惑,下面结合我自己到理解,举例说明怎样理解signal函数。
代码think.c-----------------------------------------------------------------------------------
#include<stdio.h>
/*定义一个函数*/
void func(int a){
printf("in func a=%d\n",a);
}
/*声明一个函数指针*/
void (*pfunc)(int);
/*定义我们自己到my_signal函数*/
void (*my_signal(int sig,void (*handler)(int h)))(int c){
printf("in my_signal\n");
/*想一下下面一句,对吗?*/
return handler;
}
int main(){
printf("before invoke 'void func(int)'\n");
func(1); /*(4)*/
pfunc=func;
printf("before invoke 'void func(int) by function pointer'\n");
pfunc(2); /*(5)*/
printf("before invoke 'my_signal(int sig,void (*handler)(int h)))'\n");
&n
相关文档:
Service Discovery Protocol(SDP)提供一种能力,让应用程序有方法发现哪种服务可用以及这种服务的特性。
服务发现协议(SDP或Bluetooth SDP)在蓝牙协议栈中对蓝牙环境中的应用程序有特殊的含意,发现哪个服务是可用的和确定这些可用服务的特征。SDP定义了bluetooth client发现可用bluetooth server服务和它们的特征的方法。 ......
netcat
就像 cat
指令一樣,只是將簡單的
cat
功能完全「網路化」,好用與靈活的程度可說是很驚人,而在
Top 100 Network Security Tools
排行榜中還排行第四名呢!
netcat 除了 ......
上週因為有一台很舊的 Linux 伺服器需重新安裝(簡稱 A
主機),因為所有資料都已經備份,且也已經確認無任何服務在這台主機了,所以也很放心的重灌了。不過,重灌了之後才發現原來 ......
1。下载2.6.9的内核
2。在/usr/src目录下解压内核
tar zvxf /下载的路径/linux-2.6.0.tar.gz
3。配置
# make mrproper
# make menuconfig
make mrproper 是清理代码树的动作,保证源代码是干净的
4.编译
make
5。安装
make modules_install
make install
看来2。6的编译确实比以 ......
下面是在虚拟机中的linux的ftp的基本配置(redhat AS 4.0为例):
首先要安装linux下的vsftp软件包。
rpm -qa|gerp vsftpd //查找vsftpd有没有安装
[root@RAC01 ~]# rpm -qa|grep vsftpd
vsftpd-2.0.1-5.EL4.7
[root@RAC01 ~]#
如果没有安装就 vsftpd-2.0.1-5.i386.rpm
在li ......