消息队列和信号的使用

最近在忙着个人的事情,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");
    
}
posted @ 2025-06-09 20:40  记得要好好吃饭  阅读(4)  评论(0)    收藏  举报