背景:
1.进程之间通信比较麻烦。
2进程之间需要通信,比如父子进程,等等
信号的作用:
通知其他进程响应,是进程之间的一种通信机制,
信号的处理:
接收信号的进程会马上停止,且调用信号的处理函数,
信号的处理函数:
1.默认处理函数,
首先:打印信号信息,然后:退出进程。
2.用户处理函数。
中断:
调用信号处理函数,类似程序的软中断
案例:
1. 进程之中,默认信号处理
2.进程之中,用户信号处理(软中断);
查看所有的信号:kill -l
查看当前正在执行程序的进程:ps a
往该进程添加信号,假设ps a 查看得到的进程号是4465
则,添加信号的方式是:kill -s 1(kill -l中的信号)4475
(前提是执行的进程一直在执行中!)
有两个信号没法被处理的:
1.、 SIGKILL
2、 SIGSTOP
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int main()
{
while(1)
{
printf("进程在执行!\n");
sleep(2);
}
return 0;
}
###信号的处理
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void handle(int s)
{
printf("我是信号的处理\n");
}
int main()
{
signal(SIGINT,handle);
while(1)
{
printf("信号的\n");
sleep(2);
}
return 0;
}
###使用程序来发送信号!
发送信号:
int kill(pid_t pid, int s);
进程ID:
>0:发送信号到指定进程;
=0:发送信号到该进程所在进程组的所有进程
=-1:信号发送给除了init(进程号等于 1)外的所有进程。
<-1: 发送给指定的进程组(组id = 绝对值);
案例:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main()
{
while(1)
{
kill(4988,SIGINT);//4988 是另一个进程号
sleep(2);
}
return 0;
}
@#@##
信号的应用:
1、 延时器(延迟一段时间后,在执行!) timeout
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void deal(int s)
{
printf("放音乐\n");
}
int main()
{
signal(SIGALRM,deal);
alarm(5);
while(1)
{
// signal(SIGALRM,deal);
// alarm(3);
}
return 0;
}
//将延时放在while中不能用(测试结果);
2、定时器(一定时间后,反复执行)
#include <sys/time.h>
int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *new_value,
struct itimerval *old_value);
@@
Timer values are defined by the following structures:
struct itimerval {
struct timeval it_interval; /* next value */ //间隔 时间
struct timeval it_value; /* current value */ //延时时间
};
struct timeval {
long tv_sec; /* seconds */ //表示秒
long tv_usec; /* microseconds */ //表示微妙
};
###例子1
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
void deal(int s)
{
printf("放音乐\n");
}
int main()
{
struct itimerval val = {0};
signal(SIGALRM,deal);
val.it_value.tv_sec = 3; //延时3秒
val.it_interval.tv_sec= 1; //间隔1秒
setitimer(ITIMER_REAL,&val,0);
// alarm(5);
while(1)
{
// signal(SIGALRM,deal);
// alarm(3);
}
return 0;
}