消息队列和信号的使用
最近在忙着个人的事情,6月9号今年的高考结束了,又逢高考季感慨万千....祝大家都可以金榜题名吧..
查看代码
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/msg.h>
#include <signal.h>
#include <sys/ipc.h>
#include <unistd.h>
/*************************************************
* filename:msgtest3.c
* function: A(msgtest3)创建一条消息队列后向B(msgtest4)发送一个SIGUSR1信号,
* B收到信号后,打开消息队列并讲自己的PID发送到消息队列之后,
* 发送SIGUSR2信号给A,A接收后从消息队列中读取并输出消息正文的内容
* date:2025.6.9
* note: 先运行msgtest4然后再运行msgtest3
*
* CopyRight (c) 2024-2025 l550036303@163.com All right reserved
************************************************/
volatile int state=0;
void getsign(int signum){
switch(signum){
case SIGUSR2:
printf("get message");
state=1;
break;
}
}
struct msgbuf{
long mtype;
int mnumber;
};
void main(){
//设置规则
signal(SIGUSR2,getsign);
struct msgbuf buf;
buf.mnumber=100;
//1.创建消息队列
key_t key = ftok(".",0xAB);
int msgid = msgget(key,IPC_CREAT|0664); //创建并获取消息队列ID
if(msgid == -1){
fprintf(stderr,"get error errno:%d,%s\n",errno,strerror(errno));
}
//发送命令, kill需要进程pid 而killall就不用
//kill(,SIGUSR1);
system("killall -SIGUSR1 msgtest4");
while(1){
if(state==1){
int receive = msgrcv(msgid,&buf,sizeof(buf.mnumber),0,0);
if(receive == -1){
fprintf(stderr,"receive error errno:%d,%s\n",errno,strerror(errno));
}
break;
}
}
printf("get pid:%d\n",buf.mnumber);
}
查看代码
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/msg.h>
#include <signal.h>
#include <sys/ipc.h>
#include <unistd.h>
/*************************************************
* filename:msgtest4.c
* function: A创建一条消息队列后向B(msgtest4)发送一个SIGUSR1信号,
* B收到信号后,打开消息队列并讲自己的PID发送到消息队列之后,
* 发送SIGUSR2信号给A,A接收后从消息队列中读取并输出消息正文的内容
* date:2025.6.9
* note:
*
* CopyRight (c) 2024-2025 l550036303@163.com All right reserved
************************************************/
volatile int state=0;
struct msgbuf{
long mtype;
int mnumber;
};
void getsign(int signum){
switch(signum){
case SIGUSR1:
printf("get message");
state=1;
break;
}
}
void main(){
//1.先自定义接收的信号
signal(SIGUSR1,getsign);
//循环等待信号
while(state==0){
}
key_t key = ftok(".",0xAB);
int msgid =msgget(key,0);
if(msgid == -1){
fprintf(stderr,"get error errno:%d,%s\n",errno,strerror(errno));
}
//初始化
struct msgbuf sandbuf;
sandbuf.mtype=1;
sandbuf.mnumber=getpid();
printf("my pid:%d\n",sandbuf.mnumber);
printf("my pid:%d\n",getpid());
//向队列发送信息
msgsnd(msgid,&sandbuf,sizeof(sandbuf.mnumber),0);
system("killall -SIGUSR2 msgtest3");
}

浙公网安备 33010602011771号