Linux 信号详解一(signal函数)
信号列表
SIGABRT 进程停止运行
SIGALRM 警告钟
SIGFPE 算述运算例外
SIGHUP 系统挂断
SIGILL 非法指令
SIGINT 终端中断
SIGKILL 停止进程(此信号不能被忽略或捕获)
SIGPIPE 向没有读的管道写入数据
SIGSEGV 无效内存段访问
SIGQOUT 终端退出
SIGTERM 终止
SIGUSR1 用户定义信号1
SIGUSR2 用户定义信号2
SIGCHLD 子进程已经停止或退出
SIGCONT 如果被停止则继续执行
SIGSTOP 停止执行
SIGTSTP 终端停止信号
SIGTOUT 后台进程请求进行写操作
SIGTTIN 后台进程请求进行读操作
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
signal函数
作用1:站在应用程序的角度,注册一个信号处理函数
作用2:忽略信号,设置信号默认处理 信号的安装和回复
参数
--signal是一个带signum和handler两个参数的函数,准备捕捉或屏蔽的信号由参数signum给出,接收到指定信号时将要调用的函数有handler给出
--handler这个函数必须有一个int类型的参数(即接收到的信号代码),它本身的类型是void
--handler也可以是下面两个特殊值:① SIG_IGN 屏蔽该信号 ② SIG_DFL 恢复默认行为
//忽略,屏蔽信号
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <signal.h> int main(int arg, char *args[])
{
pid_t pid=fork();
if(pid==-)
{
printf("fork() failed! error message:%s\n",strerror(errno));
return -;
}
//注册信号,屏蔽SIGCHLD信号,子进程退出,将不会给父进程发送信号,因此也不会出现僵尸进程
signal(SIGCHLD,SIG_IGN);
if(pid>)
{
printf("father is runing !\n");
sleep();
}
if(pid==)
{
printf("i am child!\n");
exit();
}
printf("game over!\n");
return ;
}
//恢复信号
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <signal.h> void catch_signal(int sign)
{
switch (sign)
{
case SIGINT:
printf("ctrl + C 被执行了!\n");
//exit(0);
break;
}
} int main(int arg, char *args[])
{
//注册终端中断信号
signal(SIGINT, catch_signal);
char tempc = ;
while ((tempc = getchar()) != 'a')
{
printf("tempc=%d\n", tempc);
//sleep()
}
//恢复信号
signal(SIGINT, SIG_DFL);
while ()
{
pause();
}
printf("game over!\n");
return ;
}
//signal()函数的返回值
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <signal.h> void catch_signal(int sign)
{
switch (sign)
{
case SIGINT:
printf("ctrl + C 被执行了!\n");
//exit(0);
break;
}
} int main(int arg, char *args[])
{
/*
* signal()函数的返回值是signal()函数上一次的行为
* */
typedef void (*sighandler_t)(int);
//因为第一次注册信号SIGINT,所以上一次的行为就是默认行为
sighandler_t old=signal(SIGINT, catch_signal);
if(old==SIG_ERR)
{
//注册信号失败
perror("signal error");
}
/*正规写法*/
if(signal(SIGQUIT,catch_signal)==SIG_ERR)
{
//注册新号失败
perror("signal error");
}
char tempc = ;
while ((tempc = getchar()) != 'a')
{
printf("tempc=%d\n", tempc);
//sleep()
}
//把默认行为重新注册,不就是恢复默认信号了
signal(SIGINT, old);
while ()
{
pause();
}
printf("game over!\n");
return ;
}
Linux 信号详解一(signal函数)的更多相关文章
- Linux 信号详解四(pause,alarm)
pause函数 --将进程置为可中断睡眠状态,然后它调用内核函数schedule(),使linux进程调度器找到另一个进程来运行. --pause使调用者进程挂起,知道一个信号被捕获. alarm函数 ...
- Linux 信号(二)—— signal 函数
弗洛伊德认为:要解决这些苦恼,当事人就要通过回忆并理解自己早期的童年经历,来获得对潜意识冲突的顿悟.弗洛伊德的疗法被称为“精神分析” (psychoanalysis),在 20 世纪的很长一段时间被心 ...
- Linux 信号详解六(可靠信号与不可靠信号)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...
- Linux 信号详解五(信号阻塞,信号未决)
信号在内核中的表示 执行信号的处理动作成为信号递达(Delivery),信号从产生到递达之间的状态称为信号未决(Pending).进程可以选择阻塞(Block)某个信号. 被阻塞的信号产生时将保持在未 ...
- Linux 信号详解二(信号分类,信号处理,kill)
信号分类 信号分为可靠信号和不可靠信号 不可靠信号的缺点 ①:处理完信号,需要重新再注册信号:②信号可能丢失. Linux已经对缺点①做了优化,现在的不可靠问题主要指的是信号可能丢失 信号还可以分为实 ...
- Linux 信号详解三(sleep,raise)
sleep()函数 .sleep()函数作用:让进程睡眠 .能被信号打断,然后处理信号函数以后,就不再睡眠,直接向下执行代码 .sleep函数的返回值是剩余秒数 //sleep 函数 #include ...
- SIGPIPE信号详解
转自:http://blog.csdn.net/lmh12506/article/details/8457772 前一段面试的时候被问到项目中有没有处理SIGPIPE信号,怎么处理的?当时没有答出来, ...
- Linux 系统结构详解
Linux 系统结构详解 Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统 ...
- (转)Linux PS 详解
原文:https://cn.aliyun.com/jiaocheng/162702.html 摘要:原文地址:http://www.cnblogs.com/wangkangluo1/archive/2 ...
随机推荐
- 详解 Spotlight on MySQL监控MySQL服务器
前一章详解了Spotlight on Unix 监控Linux服务器 ,今天再来看看Spotlight on MySQL怎么监控MySQL服务器. 注:http://www.cnblogs.com/J ...
- 让shell脚本在后台飞
1. 使用&符号在后台执行命令 你可以在Linux命令或者脚本后面增加&符号,从而使命令或脚本在后台执行,例如:. $ ./my-shell-script.sh & 2. 使用 ...
- Makefile关键字
@ makefile会把将要执行的命令行在命令执行前输出到屏幕上,使用@可以避免显示出命令本身 若@ echo 正在编译-则$make显示正在编译- 若echo 正在编译-则$make显示: echo ...
- Linux运行等级,根目录,文件类型etc
Linux的Runlevel Linux默认有6个Terminal(Ctrl+Alt+F1~F6)和1个X window(Ctrl+Alt+F7,图形化界面)让用户登录 Linux的runlevel一 ...
- DOS命令批量重命名文件配合Excel 操作备忘
批量取得文件夹下文件名 有时候文件夹下有好多图片什么的,文件名称不是统一的格式,想统一一下,于是google找到以下方法,进入要操作的目录,按住shift键的同时,单击鼠标右键,你会看到在此处打开命令 ...
- PHPCMS如何开启手机站点
现在手机端用户增长急速增长,看天猫今年双十一,有47%交易是移动端交易的,所以手机功能已逐渐替代电脑的功能,使用手机上网已经成为了互联网新的趋势,很多客户以及站长都希望手机能够访问自己的网站,那么今天 ...
- cuda多线程间通信
#include "cuda_runtime.h" #include "device_launch_parameters.h" #include <std ...
- UVALive 5000 Underwater Snipers --二分
题意:一条河岸线y=k,y>k区域有n个敌人,现在要在y<=k区域布置S个狙击手,狙击手的狙击范围为距离自己半径为D的圆内,问满足能够狙死所有的敌人的情况下,离河岸线最近的那个狙击手的离河 ...
- ural One-two, One-two 2
One-two, One-two 2 Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- ural 1208 Legendary Teams Contest
题意描述:给定K支队伍,每队三个队员,不同队伍之间队员可能部分重复,输出这些队员同时能够组成多少完整的队伍: DFS,利用DFS深度优先搜索,如果该队所有队员都没有被访问过,那么将该队计入结果,再去选 ...