进程A与B互传信号并做出反应
进程A与B互传信号并做出反应
练习:要求进程A创建一条消息队列之后向进程B发送SIGUSR1信号,进程B收到该信号
之后打开消息队列并把进程的PID作为消息写入到消息队列中,要求进程B在写入消息之后,
发SIGUSR2信号给进程A,进程A收到该信号则从消息队列中读取消息并输出消息正文的内
容。
进程A:
/********************************************************************
*
* file name: process_a.c
* author: 15070884254@163.com
* date: 2024年5月27日
* function: 练习:要求进程A创建一条消息队列之后向进程B发送SIGUSR1信号,进程B收到该信号
之后打开消息队列并把进程的PID作为消息写入到消息队列中,要求进程B在写入消息之后,
发SIGUSR2信号给进程A,进程A收到该信号则从消息队列中读取消息并输出消息正文的内
`````````````````````````````````容。
* note: none
*
* CopyRight (c) 15070884254@163.com All Right Reseverd
*
********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <signal.h>
int msgid;
/*****************************************************************************
* 函数名称: signal2_handler
* 函数功能: 接受进程B发来的SIGUSR2信号
* 函数参数: int signo
* 返回结果: NONE
* 注意事项: NONE
* 函数作者: 15070884254@163.com
* 创建日期: 2024年5月27日
* 修改历史: 2024年5月27日
* 函数版本: 1.0
*
*****************************************************************************/
void signal2_handler(int signo)
{
struct
{
long mesg_type;
char mesg_text[256];
} mesgbuf;
if (msgrcv(msgid, &mesgbuf, sizeof(mesgbuf.mesg_text), 1, 0) != -1)
{
printf("process B message_: %s\n", mesgbuf.mesg_text);
}
else
{
perror("msgrcv");
}
}
int main()
{
key_t key = ftok(".", 0xFFFFFF01);
int msgid = msgget(key, 0666 | IPC_CREAT);
if (msgid == -1)
{
perror("msgget");
exit(EXIT_FAILURE);
}
// 输出创建成功的消息队列的key
printf("msg key: %#x\n", key);
signal(SIGUSR2, signal2_handler);
system("killall -SIGUSR1 pro_b");
printf("Sent SIGUSR1 to Process B\n");
while (1)
{
sleep(1);
}
return 0;
}
进程B:
/********************************************************************
*
* file name: process_b.c
* author: 15070884254@163.com
* date: 2024年5月27日
* function: 练习:要求进程A创建一条消息队列之后向进程B发送SIGUSR1信号,进程B收到该信号
之后打开消息队列并把进程的PID作为消息写入到消息队列中,要求进程B在写入消息之后,
发SIGUSR2信号给进程A,进程A收到该信号则从消息队列中读取消息并输出消息正文的内
`````````````````````````````````容。
* note: none
*
* CopyRight (c) 15070884254@163.com All Right Reseverd
*
********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <signal.h>
#define MSG_SIZE 256
int msgid;
/*****************************************************************************
* 函数名称: signal1_handler
* 函数功能: 接受进程A发来的SIGUSR1信号
* 函数参数: int signo
* 返回结果: NONE
* 注意事项: NONE
* 函数作者: 15070884254@163.com
* 创建日期: 2024年5月27日
* 修改历史: 2024年5月27日
* 函数版本: 1.0
*
*****************************************************************************/
void sign1_handler(int signo)
{
struct
{
long mtype;
char mtext[MSG_SIZE];
} msgbuf;
msgid = msgget(ftok(".", 0xFFFFFF01), 0666);
if (msgid == -1)
{
perror("msgget");
exit(EXIT_FAILURE);
}
sprintf(msgbuf.mtext, "%d", getpid());
msgbuf.mtype = 1;
if (msgsnd(msgid, &msgbuf, MSG_SIZE, 0) == -1)
{
perror("msgsnd");
}
system("killall -SIGUSR2 pro_a");
printf("Process B sent SIGUSR2 to process A\n");
}
int main()
{
signal(SIGUSR1, sign1_handler);
while (1)
{
sleep(1);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现