日期:2014-05-16  浏览次数:20622 次

请问linux C编程时可以中断嵌套吗
比如在SIGINT信号的handler中,能否被自己中断?
如果可以中断的话,最多可以嵌套几层啊?

------解决方案--------------------
是可以自己中断的
设置用户自己的信号中断处理函数,以SIGINT信号为例:
int flag=0;
void myself()
{
flag=1;
printf( "get signal SIGINT\n ");
/*若要重新设置SIGINT信号中断处理函数为本函数则执行以
*下步骤*/
void (*a)();
a=myself;
signal(SIGINT,a);
flag=2;
}
main()
{
while (1) {
sleep(2000); /*等待中断信号*/
if (flag==1) {
printf( "skip system call sleep\n ");
exit(0);
}
if (flag==2) {
printf( "skip system call sleep\n ");
printf( "waiting for next signal\n ");
}
}
}
11.kill()
功能:向一个或一组进程发送一个信号.
语法:#include
#include
int kill(pid,sig);
pid_t pid;
int sig;
说明:本系统调用向一个或一组进程发送一个信号,该信号由参数sig指
定,为系统给出的信号表中的一个.若为0(空信号)则检查错误但
实际上并没有发送信号,用于检查pid的有效性.
pid指定将要被发送信号的进程或进程组.pid若大于0,则信号将
被发送到进程号等于pid的进程;若pid等于0则信号将被发送到所
有的与发送信号进程同在一个进程组的进程(系统的特殊进程除
外);若pid小于-1,则信号将被发送到所有进程组号与pid绝对值
相同的进程;若pid等于-1,则信号将被发送到所有的进程(特殊系
统进程除外).
信号要发送到指定的进程,首先调用进程必须有对该进程发送信
号的权限.若调用进程有合适的优先级则具备有权限.若调用进程
的实际或有效的UID等于接收信号的进程的实际UID或用setuid()
系统调用设置的UID,或sig等于SIGCONT同时收发双方进程的会话
号相同,则调用进程也有发送信号的权限.
若进程有发送信号到pid指定的任何一个进程的权限则调用成功,
否则调用失败,没有信号发出.
返回值:调用成功则返回0,否则返回-1.
例子:假设前一个例子进程号为324,现向它发一个SIGINT信号,让它做
信号处理:
kill((pid_t)324,SIGINT);
------解决方案--------------------
相同的信号会自动屏蔽,比如连续多次alarm你会发现只会调用一次处理函数。但是不同的信号可能会嵌套,给你一个直观的例子:

#include <signal.h>
#include <stdio.h>

unsigned int flag = 0;

void
alrm_handler ()
{
FILE* fp;
printf ( "get signal SIGALRM\n ");
while(1) {
// while循环里面只是做一些耗时的工作,没有其他作用。
fp = fopen( "/tmp/1.txt ", "rb+ ");
fclose(fp);
if(!(flag++ % 1000))
printf ( ". ");
}
}

void int_handler()
{
printf ( "get signal SIGINT\n ");

}

main ()
{
signal(SIGALRM, alrm_handler);
signal(SIGINT, int_handler);
alarm(2);
while (1)
{
sleep (2000);
printf ( "skip system call sleep\n ");
}
}

按CTL-C会给程序发送SIGINT信号。