qidao123.com技术社区-IT企服评测·应用市场
标题:
消息队列练习
[打印本页]
作者:
知者何南
时间:
2025-5-8 13:23
标题:
消息队列练习
进程A创建一条消息队列之后向进程B发送SIGUSR1信号,进程B收到该信号之后打开消息队列并把进程的PID作为消息写入到消息队列中,进程B在写入消息之后,发SIGUSR2信号给进程A,进程A收到该信号则从消息队列中读取消息并输出。
/********************************************************************************
*
*
* 消息队列和信号结合
* author:jindouliu2024@163.com
* date:2025.5.8
*
*
* Copyright (c) 2024-2025 jindouliu2024@163.com All right Reserved
********************************************************************************/
复制代码
#include<stdio.h>
#include<signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
int key;
int msg_id,id,x;
struct msgbuf {
long mtype; /* message type, must be > 0 */
int mtext[1]; /* message data */
};
struct msgbuf msg1;
//信号处理函数
void sig_handler(int signal)
{
//如果是接受到的信号是SIGUSR1,则执行
if(signal == SIGUSR1){
msg1.mtype = 1;
x = getpid();
msg1.mtext[0] = x;
printf("id = %d",x);
msgsnd(msg_id,&msg1,sizeof(msg1.mtext[0]),IPC_NOWAIT);
printf("请输入进程id:");
scanf("%d",&id);
kill(id,SIGUSR2);
}
}
int main()
{
//获取键值
key = ftok(".",1);
//创建消息队列
msg_id = msgget(key,IPC_CREAT|IPC_EXCL|0644);
if(msg_id == -1){
printf("msgget error \n");
//如果队列存在则直接打开
msg_id = msgget(key,IPC_EXCL|0644);
}
printf("running\n");
signal(SIGUSR1,sig_handler);
while(1);
return 0;
}
复制代码
#include<stdio.h>
#include<signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
int key;
int msg_id,id;
struct msgbuf {
long mtype; /* message type, must be > 0 */
int mtext[1]; /* message data */
};
struct msgbuf msg1;
//信号处理函数
void sig_handler(int signal)
{
//如果是接受到的信号是SIGUSR1,则执行
if(signal == SIGUSR2){
printf("22\n");
msgrcv(msg_id,&msg1,sizeof(msg1.mtext[0]),0,0);
printf("process A id is %d\n",msg1.mtext[0]);
}
}
int main()
{
//获取键值
key = ftok(".",1);
//创建消息队列
msg_id = msgget(key,IPC_CREAT|IPC_EXCL|0644);
if(msg_id == -1){
printf("msgget error \n");
//如果队列存在则直接打开
msg_id = msgget(key,IPC_EXCL|0644);
}
printf("running2\n");
printf("请输入进程id:");
scanf("%d",&id);
//发送消息
kill(id,SIGUSR1);
signal(SIGUSR2,sig_handler);
while(1);
return 0;
}
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/)
Powered by Discuz! X3.4