系统编程-信号-信号发送kill、raise、alarm
信号发送
kill 和 raise函数
kill函数参数详解:
实验1 raise和kill 的使用
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h> //定义信号处理函数
//signo: 进程捕获到的信号
void sig_handler(int signo){
printf("%d, %d occured \n", getpid(), signo);
wait(NULL);
} int main(void)
{
pid_t pid; if(signal(SIGUSR1, sig_handler) == SIG_ERR){
perror("signal error");
} if(signal(SIGUSR2, sig_handler) == SIG_ERR){
perror("signal error");
} sleep(1); printf("向进程自己发送SIGUSR1 和 SIGUSR2 .\n");
raise(SIGUSR1);
kill(getpid(), SIGUSR2); while(1){
sleep(1);
}
}
编译运行:
结论1.1:raise(SIGUSR1) 等价于 kill(getpid(), SIGUSR2)
结论1.2: 进程可以向自己发送信号
实验2 进程能够自杀吗?
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h> //定义信号处理函数
//signo: 进程捕获到的信号
void sig_handler(int signo){
printf("%d, %d occured \n", getpid(), signo);
wait(NULL);
} int main(void)
{
pid_t pid; if(signal(SIGUSR1, sig_handler) == SIG_ERR){
perror("signal error");
} if(signal(SIGUSR2, sig_handler) == SIG_ERR){
perror("signal error");
} sleep(1); printf("进程能够自杀吗?\n");
raise(SIGKILL); while(1){
sleep(1);
}
}
编译运行:
结论: 进程可以通过发送9号信号杀死自己
定时器 alarm 和 ualarm
实验3 alarm使用
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h> //定义信号处理函数
//signo: 进程捕获到的信号
void sig_handler(int signo){ if(signo == SIGALRM){
printf("clock time out \n"); //需要重新设置定时器,使之成为一个周期性触发的定时器
if(0 != alarm(5)){
perror("alarm:5 error");
}
}
} int main(void)
{
pid_t pid;
int cnt=0; if(signal(SIGALRM, sig_handler) == SIG_ERR){
perror("signal error");
} if(0 != alarm(5)){
perror("alarm:5 error");
} while(1){
printf("main -- 1s -- \n");
sleep(1);
if((cnt++) == 13)
alarm(0); } return 0;
}
编译运行:
ualarm:微妙级别的定时器,精读比alarm高
.
系统编程-信号-信号发送kill、raise、alarm的更多相关文章
- linux系统编程之信号(六):信号发送函数sigqueue和信号安装函数sigaction
一,sigaction() #include <signal.h> int sigaction(int signum,const struct sigaction *act,struct ...
- linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction
信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然 ...
- linux系统编程之信号(二):信号处理流程(产生、注册、注销、执行)
对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个阶段: 信号诞生 信号在进程中注册 信号在进程中的注销 信号处理函数执行 1 信号诞生 信号事件 ...
- linux系统编程之信号(一):中断与信号
一,什么是中断? 1.中断的基本概念 中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被 ...
- 信号的发送kill,raise,alarm,setitimer,abort,sigqueue
1.kill函数 int kill(pid_t pid, int sig); 发送信号给指定的进程. (1) If pid is positive, then signal sig is sent t ...
- Unix系统编程()发送信号kill
与shell的kill命令类似,一个进程能够使用kill系统调用向另一进程发送信号. 之所以选择kill作为术语,因为早期UNIX实现中大多数信号的默认行为是终止进程. #include <si ...
- linux系统编程之信号(三):信号安装、signal、kill,arise讲解
一,信号安装 如果进程要处理某一信号,那么就要在进程中安装该信号.安装信号主要用来确定信号值及进程针对该信号值的动作之间的映射关系,即进程将要处理哪个信号:该信号被传递给进程时,将执行何种操作. li ...
- linux系统编程之信号(三)
今天继续对信号进行研究,话不多说,言归正传: 更多信号发送函数: 上节中我们已经接触到了一些信号的发送函数,这里更进一步学习一下其它的发送函数: alarm:只能发送SIGALRM信号 下面通过一个例 ...
- linux系统编程之信号(二)
经过了漫长的间歇,对于c语言的学习也被中断了很久,现实确实有很多的无耐,计划中的事情总会被打乱,但不管怎样,学习的道路是不能休止的,所以经过了一断温习后现在继续学习C语言,话不多说,进入正题: 信号分 ...
- linux系统编程之信号(七)
今天继续学习信号,主要是学习关于时间和定时器相关的函数的使用,关于这个实际上有很多内容,这里先简要进行说明,等之后再慢慢进行相关深入,也主要是为接下来要做的一个综合linux系统编程的例子做准备,好了 ...
随机推荐
- LeetCode & Binary Search 解题模版
LeetCode & Binary Search 解题模版 In computer science, binary search, also known as half-interval se ...
- redux & dispatch & payload
redux & dispatch & payload react & react-redux & redux-saga // contrast dispatch({ t ...
- nasm astrrchr函数 x86
xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...
- Flutter: Draggable和DragTarget 可拖动小部件
API class _MyHomeState extends State<MyHome> { List<Map<String, String>> _data1 = ...
- SPC空投价值高达310万美金,生态建设者直呼真香!
市场上面有句名言:"人赚不到自己认知以外的财富",这在数字加密上也是共通的.早在本月12日,也就是前天,NGK官方发行的第N波利好---SPC侧链代币空投已经陆续发放了,NGK以及 ...
- 2020 NGK 全球启动大会于美国硅谷圆满落幕
据NCC报道美国西海岸时间11月25日,NGK全球启动大会在美国加利福尼亚北部的硅谷会展中心成功举办.本次大会吸引了来自世界各地的企业家.创业者.开发者,以及投资人达一万人次齐聚硅谷. NGK创始人. ...
- Hive-常见调优方式 && 两个面试sql
Hive作为大数据领域常用的数据仓库组件,在设计和开发阶段需要注意效率.影响Hive效率的不仅仅是数据量过大:数据倾斜.数据冗余.job或I/O过多.MapReduce分配不合理等因素都对Hive的效 ...
- Oracle数据库在给表添加字段的sql中用comment报错
原因:不同于mysql,Oracle数据库在添加表字段时不能直接用comment,而是单独写一个sql语句,如下: alter table SYS_USER add SENDMSG_LASTTIME ...
- ValidationUtils 验证工具
package com.appnirman.vaidationutils;import android.content.Context;import java.util.regex.Matcher;i ...
- 一个 java 文件的执行过程详解
平时我们都使用 idea.eclipse 等软件来编写代码,在编写完之后直接点击运行就可以启动程序了,那么这个过程是怎么样的? 总体过程 我们编写的 java 文件在由编译器编译后会生成对应的 cla ...