信号(三)
SIGALRM
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<errno.h>
#include<string.h>
#include <unistd.h>
#include<signal.h>
#define ERROR_EXIT(m) (perror(m),exit(EXIT_FAILURE))
#define MAJOR(a) (int)((unsigned short)a>>8)
#define MINOR(a) (int)((unsigned short)a & 0xFF)
void handler(int sig);
int main(int argc, char* argv[])
{
signal(SIGALRM,handler);
//发送一个警告信号
alarm(2);
for(;;)
{
pause();
printf("pause return\n");
}
return 0;
}
void handler(int sig){
printf("recv a sig=%d\n",sig);
sleep(2);
}
可重入函数
#define MAJOR(a) (int)((unsigned short)a>>8)
#define MINOR(a) (int)((unsigned short)a & 0xFF)
void handler(int sig);
typedef struct{
int a;
int b;
}test;
test g_data;
int main(int argc, char* argv[])
{
signal(SIGALRM,handler);
//发送一个警告信号
alarm(1);
test one={1,1};
test zero={0,0};
for(;;)
{
g_data=zero;
g_data=one;
}
return 0;
}
void handler(int sig){
printf("%d,%d\n",g_data.a,g_data.b);
alarm(1);
}
信号(四)
#include <sys/stat.h>
#include <fcntl.h>
#include<errno.h>
#include<string.h>
#include <unistd.h>
#include<signal.h>
#define ERROR_EXIT(m) (perror(m),exit(EXIT_FAILURE))
#define MAJOR(a) (int)((unsigned short)a>>8)
#define MINOR(a) (int)((unsigned short)a & 0xFF)
void handler(int sig);
void printsigset(sigset_t *set){
int i;
for(i=1;i<NSIG;i++){
if(sigismember(set,i))
putchar('1');
for(i=1;i<NSIG;i++){
if(sigismember(set,i))
putchar('1');
else
putchar('0');
}
printf("\n");
}
int main(int argc, char* argv[])
{
sigset_t pset;
sigset_t bset;
sigemptyset(&bset);
sigaddset(&bset,SIGINT);
if(signal(SIGINT,handler)==SIG_ERR)
ERROR_EXIT("signal error");
sigprocmask(SIG_BLOCK,&bset,NULL);
for(;;)
putchar('0');
}
printf("\n");
}
int main(int argc, char* argv[])
{
sigset_t pset;
sigset_t bset;
sigemptyset(&bset);
sigaddset(&bset,SIGINT);
if(signal(SIGINT,handler)==SIG_ERR)
ERROR_EXIT("signal error");
sigprocmask(SIG_BLOCK,&bset,NULL);
for(;;)
{
sigpending(&pset);
printsigset(&pset);
sleep(1);
}
return 0;
}
void handler(int sig){
if(sig== SIGINT)
printf("recv=%d\n",sig);
else if(sig== SIGQUIT)
{
sigset_t uset;
sigemptyset(&uset);
sigaddset(&uset,SIGINT);
sigprocmask(SIG_UNBLOCK,&uset,NULL);
}
}