终端按键产生信号
硬件异常产生信号
kill函数/命令产生信号
kill命令
kill函数
/*
* @file kill.c
* @brief 使用kill函数杀死自己
* @version 1.1 无
* @author 北豼
* @date 2022年5月10日
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
int main(void)
{
int ret;
//产生了一个信号,执行了默认动作
ret = kill(getpid(), SIGKILL);
if (ret == -1)
{
perror("kill error");
exit(1);
}
return 0;
}
/*
* @file kill_1.c
* @brief 使用kill函数杀死指定一个子进程
* @version 1.1 无
* @author 北豼
* @date 2022年5月10日
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
int main(void)
{
int i;
pid_t p;
pid_t pid;
//循环创建5个子进程
for (i = 0; i < 5; i++)
{
pid = fork();
if (pid == 0)
{
break;
}
if (i == 3)
{
p = pid;
}
}
if (i < 5)
{
while (1)
{
sleep(1);
printf("I am %d child, pid = %u\n", i+1, getpid());
}
}
else
{
kill(p, SIGKILL); //杀死了指定进程
printf("I am parent\n");
}
return 0;
}
使用kill函数
杀死了子进程4
raise和abort函数
软件条件产生信号
/*
* @file alarm.c
* @brief 测试计算机一秒能数多少个数
* @version 1.1 无
* @author 北豼
* @date 2022年5月10日
*/
#include <stdio.h>
#include <unistd.h>
int main(void)
{
int i;
//计时一秒,发送SIGALRM信号,执行默认动作使调用该函数的进程结束
alarm(1);
//一秒能数多少个数
for (i = 0; ; i++)
{
printf("%d\n", i);
}
return 0;
}
加上time就可以显示运行时间
当不把结果输出到屏幕上,运行效率就会提高
/*
* @file setitimer.c
* @brief 使用setitimer函数实现alarm函数定时
* @version 1.1 无
* @author 北豼
* @date 2022年5月10日
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
/*
* 函数名称: my_alarm
* 函数介绍: 使用setitimer函数实现alarm函数定时
* 输入参数: unsigned int sec
* 输出参数: 无
* 返回值 : unsigned int oldit.it_value.tv_sec
*/
unsigned int my_alarm(unsigned int sec)
{
struct itimerval it;
struct itimerval oldit;
int ret;
//设置时间
it.it_value.tv_sec = sec;
it.it_value.tv_usec = 0;
//设置间隔
it.it_interval.tv_sec = 0;
it.it_interval.tv_usec = 0;
//开始计时
ret = setitimer(ITIMER_REAL, &it, &oldit);
if (ret == -1)
{
perror("setitimer");
exit(1);
}
return oldit.it_value.tv_sec;
}
int main(void)
{
int i;
my_alarm(1);
for (i = 0; ; i++)
{
printf("%d\n", i);
}
return 0;
}