查看: 64|回覆: 0

消息队列练习

[複製鏈接]

4

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2008-9-16
發表於 2025-5-8 14:07:00 | 顯示全部樓層 |閲讀模式

进程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;
}



来源:https://www.cnblogs.com/lradian/p/18866181
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部