信号(一)

中段分类

信号

信号与中断

信号名称






代码实现
#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);
}

本文介绍了信号处理的基础概念,包括信号分类、可靠信号与实时信号的区别。通过具体的代码示例展示了如何使用 C 语言来实现信号的捕捉与处理,涵盖了信号注册、发送及暂停等操作。
440

被折叠的 条评论
为什么被折叠?



