国外推广国内网站,商丘网站建设略奥网,网站更改logo,软件技术招聘信息c traps and pitfalls 对signal函数解释得非常详细。
signal.h 中
void ( *signal( int sig, void (* handler)( int ))) ( int ); int (*p)(); 这是一个函数指针, p所指向的函数是一个不带任何参数, 并且返回值为int的一个函数. int (*fun())(); 这个式子与上面式子…c traps and pitfalls 对signal函数解释得非常详细。
signal.h 中
void ( *signal( int sig, void (* handler)( int ))) ( int ); int (*p)(); 这是一个函数指针, p所指向的函数是一个不带任何参数, 并且返回值为int的一个函数. int (*fun())(); 这个式子与上面式子的区别在于用fun()代替了p,而fun()是一个函数,所以说就可以看成是fun()这个函数执行之后,它的返回值是一个函数指针,这个函数指针(其实就是上面的p)所指向的函数是一个不带任何参数,并且返回值为int的一个函数.
void (*signal(int signo, void (*handler)(int)))(int);就可以看成是signal()函数(它自己是带两个参数,一个为整型,一个为函数指针的函数), 而这个signal()函数的返回值也为一个函数指针,这个函数指针指向一个带一个整型参数,并且返回值为void的一个函数.
在写信号处理函数时对于信号处理的函数也是void sig_fun(int signo);这种类型,恰好与上面signal()函数所返回的函数指针所指向的函数是一样的.
void ( *signal() )( int ); signal是一个函数, 它返回一个函数指针, 后者所指向的函数接受一个整型参数 且没有返回值, 仔细看, 是不是siganal( int signo, void (*handler)(int) )的第2个参数了, 对了, 其实他所返回的就是 signal的第2个信号处理函数, 指向信号处理函数, 就可以执行函数了( signal内部时, signal把信号做为参数传递给handler信号处理函数, 接着 signal 函数返回指针, 并且又指向信号处理函数, 就开始执行它) 那么signal函数的参数又是如何呢signal函数接受两个参数一个整型的信号编号以及一个指向用户定义的信号处理函数的指针。我们此前已经定义了指向用户定义的信号处理函数的指针sfp void (*sfp)(int); sfp 的类型可以通过将上面的声明中的sfp去掉而得到即void (*)(int)。此外signal函数的返回值是一个指向调用前的用户定义信号处理函数的指针这个指针的类型与sfp指针类型一致。因此我们可以如下声明signal函数 void (*signal(int, void(*)(int)))(int); 同样地使用typedef可以简化上面的函数声明 typedef void (*HANDLER)(int);
HANDLER signal(int, HANDLER); 下面来看一个简单的例子 #include signal.h
#include unistd.h
#include stdio.h
void sigroutine(int dunno)
{ /* 信号处理例程其中dunno将会得到信号的值 */
switch (dunno)
{
case 1:
printf(Get a signal -- SIGHUP\n );
break;
case 2:
printf(Get a signal -- SIGINT\n );
break;
case 3:
printf(Get a signal -- SIGQUIT\n );
break;
}
return;
}
int main()
{
printf(process id is %d\n ,getpid());
signal(SIGHUP, sigroutine); //* 下面设置三个信号的处理方法
signal(SIGINT, sigroutine);
signal(SIGQUIT, sigroutine);
for (;;) ;
} 其中信号SIGINT由按下Ctrl-C发出信号SIGQUIT由按下Ctrl-发出。该程序执行的结果如下 [zcmt #29]$make
gcc -g -c -o a.o a.c
gcc -g -o a a.o
[zcmt #30]$./a
process id is 7666
^C Get a signal -- SIGINT
^Z
[1] Stopped ./a
[zcmt #31]$ps aux|grep ./a
root 1164 0.0 0.0 13320 748 ? Ssl 20:24 0:00 /sbin/audispd
root 1275 0.0 0.0 1880 580 ? Ss 20:24 0:00 /usr/sbin/acpid
68 1395 0.0 0.0 3384 948 ? S 20:24 0:00 hald-addon-acpi: listening on acpid socket /var/run/acpid.socket
root 1669 0.0 0.5 22344 6028 ? Ss 20:26 0:00 /usr/sbin/abrtd
root 1697 0.0 0.0 2240 320 ? Ss 20:26 0:00 /usr/sbin/atd
root 1742 1.6 2.1 32496 21752 tty1 Rs 20:26 1:47 /usr/bin/Xorg :0 -nr -verbose -auth /var/run/gdm/auth-for-gdm-eLxmfB/database -nolisten tcp vt1
zcm 2388 0.0 1.4 34860 15316 ? S 20:32 0:00 python /usr/share/system-config-printer/applet.py
zcm 7666 7.5 0.0 1728 356 pts/0 T 22:15 0:06 ./a
zcm 7714 0.0 0.0 5816 724 pts/0 S 22:17 0:00 grep ./a
[zcmt #32]$kill -HUP 463
bash: kill: (463) - 没有那个进程
[zcmt #33]$kill -HUP 7666
[zcmt #34]$kill -9 7666
[zcmt #35]$ps aux|grep ./a
root 1164 0.0 0.0 13320 748 ? Ssl 20:24 0:00 /sbin/audispd
root 1275 0.0 0.0 1880 580 ? Ss 20:24 0:00 /usr/sbin/acpid
68 1395 0.0 0.0 3384 948 ? S 20:24 0:00 hald-addon-acpi: listening on acpid socket /var/run/acpid.socket
root 1669 0.0 0.5 22344 6028 ? Ss 20:26 0:00 /usr/sbin/abrtd
root 1697 0.0 0.0 2240 320 ? Ss 20:26 0:00 /usr/sbin/atd
root 1742 1.6 2.1 32496 21752 tty1 Rs 20:26 1:48 /usr/bin/Xorg :0 -nr -verbose -auth /var/run/gdm/auth-for-gdm-eLxmfB/database -nolisten tcp vt1
zcm 2388 0.0 1.4 34860 15324 ? S 20:32 0:00 python /usr/share/system-config-printer/applet.py
zcm 7746 0.0 0.0 5816 756 pts/0 S 22:18 0:00 grep ./a
[1] 已杀死 ./a
[zcmt #36]$