信号(一)
中段分类
信号
信号与中断
信号名称
代码实现
#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 handler(int sig);
int main(int argc, char* argv[])
{
__sighandler_t oldhandler;
oldhandler=signal(SIGINT,handler);
if(oldhandler==SIG_ERR)
ERROR_EXIT("signal error");
while(getchar()!='\n');
;
if(signal(SIGINT,oldhandler)==SIG_ERR)
ERROR_EXIT("signal error");
for(;;);
return 0;
}
void handler(int sig){
printf("recv a sig=%d\n",sig);
信号分类
不可靠信号
实时信号
信号发送
man 2 kill
代码实现
#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[])
{
//注册一个信号
if(signal(SIGUSR1,handler)==SIG_ERR)
ERROR_EXIT("signal error");
pid_t pid=fork();
if(pid==-1)
ERROR_EXIT("fork error");
if(pid==0)
{
//子进程和父进程都会受到sig信号,进而处理信号
pid=-getppid();
kill(pid,SIGUSR1);
exit(EXIT_SUCCESS);
}
int n=5;
do{
n=sleep(n);
}while(n>0);
return 0;
}
void handler(int sig){
printf("recv a sig=%d\n",sig);
}
pause
代码实现
#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(SIGINT,handler);
for(;;)
{
pause();
printf("pause return\n");
}
return 0;
}
void handler(int sig){
printf("recv a sig=%d\n",sig);
sleep(2);
}