好,正想民学习学习呢
十二、信号通信(未完待续....)
信号通信也是进程通讯的一种方式,其产生主要有以下四种方式:
1、用户按下按键
2、硬件异常
3、进程用kill函数将信号发送到另一个进程
4、用户用kill命令将信号发送给其他进程
当进程接受到了信号时,可以有以下三种处理方式:
1、忽略此信号(注意SIGKILL、SIGSTOP不能忽略)
2、执行用户希望的动作
3、执行系统默认动作
1、发送信号
包含头文件:
#include<sys/types.h>
#include<signal.h>
int kill(pid_t pid,int signo)
参数:pid:信号所要发到的进程
Signo:信号
Kill可以向自身进程发送信号,也可以向其他进程发送信号
Kill的pid参数:
1、pid>0 将信号发送到进程号为pid的进程
2、pid=0 将信号发送到同组的进程
3、pid<0 将信号发送到其他组ID=pid绝对值的进程
4、pid=-1 将信号发送到所有进程
int raise(int signo)
参数:signo:信号
Raise只能向自身发送信号,所以不需要pid参数
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
if((pid = fork()) < 0)
{
printf("fork error\n");
exit(1);
}
if(pid == 0)
{
printf("child (pid = %d) is waitting for any signal\n",getpid());
raise(SIGSTOP);
exit(0);
}
else
{
if(waitpid(pid,NULL,WNOHANG) == 0)
{
if(kill(pid,SIGKILL) == 0)
{
printf("parent kill %d\n",pid);
}
}
}
waitpid(pid,NULL,0);
printf("waitpid end\n");
exit(0);
}
alarm函数
包含头文件:#include<unistd.h>
Unsigned int alarm(unsigned int seconds)
经过了指定的seconds秒后,给自己发SIGALRM信号
pause
包含头文件:#include<unistd.h>
Int pause(void)
使进程挂起直至进程捕捉到一个信号,挂起才结束

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
if(alarm(5) < 0)
{
printf("alarm error\n");
exit(1);
}
pause();
printf("hi\n");
}
2、信号处理
有了信号的发送以及捕获,那么接下来是对信号的具体处理。一个进程可以选择忽略某些信号而只处理其他一些信号,另外,一个进程还可以选择如何处理信号。首先需要建立进程与其信号之间的对应关系,这就是信号处理。
signal
包含头文件:#include<signal.h>
Void (* signal(int signo,void (*func)(int)))(int)
指定信号的响应函数,当进程接收到此注册信号(signo)时,就会调用响应函数func
Func的取值:
1、SIG_IGN:忽略此信号
2、SIG——DFL:系统默认方式处理
3、信号处理函数名:使用该函数处理
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
void myfun(int sign_no)
{
if(sign_no == SIGINT)
{
printf("get sigint \n");
}
else if(sign_no == SIGQUIT)
{
printf("get sigquit \n");
}
}
int main()
{
printf("get signal\n");
signal(SIGINT,myfun);
signal(SIGQUIT,myfun);
pause();
exit(0);
}

回复
| 有奖活动 | |
|---|---|
| 这个春节你犒赏自己什么了?分享你的故事,有奖征集 | |
| 2026年“我要开发板活动”第三季,开始了! | |
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
我要赚赏金打赏帖 |
|
|---|---|
| 【S32K3XX】SWT 模块使用被打赏¥22元 | |
| 【分享开发笔记,赚取280元手持便携数字示波器】32位linux内核内存映射896的理解被打赏¥14元 | |
| AG32VH407开发板例程体系的构成与使用方法被打赏¥20元 | |
| 【S32K3XX】SEMA42 模块使用被打赏¥26元 | |
| 【S32K3XX】XRDC 功能使用被打赏¥22元 | |
| 【分享开发笔记,赚取280元手持便携数字示波器】8051使用keil编译的程序移动心得被打赏¥21元 | |
| 【S32K3XX】HSE 密钥管理被打赏¥17元 | |
| 【S32K3XX】Standby RAM的初始化流程被打赏¥18元 | |
| Gravity:中英文语音合成模块V2.0及其串口控制被打赏¥24元 | |
| 全彩色度变化图的绘制被打赏¥27元 | |
我要赚赏金
