时来运转勇哥 發表於 2025-5-8 14:07:00

消息队列练习

<p>进程A创建一条消息队列之后向进程B发送SIGUSR1信号,进程B收到该信号之后打开消息队列并把进程的PID作为消息写入到消息队列中,进程B在写入消息之后,发SIGUSR2信号给进程A,进程A收到该信号则从消息队列中读取消息并输出。</p>
<pre><code>/********************************************************************************
*
*
* 消息队列和信号结合
* author:jindouliu2024@163.com
* date:2025.5.8
*
*
* Copyright (c)2024-2025   jindouliu2024@163.com   All right Reserved
********************************************************************************/
</code></pre>
<pre><code>#include&lt;stdio.h&gt;
#include&lt;signal.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/ipc.h&gt;
#include &lt;sys/msg.h&gt;
#include &lt;unistd.h&gt;
int key;
int msg_id,id,x;
struct msgbuf {
               long mtype;       /* message type, must be &gt; 0 */
               intmtext;    /* message data */
         };
struct msgbuf msg1;         
//信号处理函数
void sig_handler(int signal)
{
        //如果是接受到的信号是SIGUSR1,则执行
        if(signal == SIGUSR1){
                msg1.mtype = 1;
                x = getpid();
                msg1.mtext = x;
                printf("id = %d",x);
                msgsnd(msg_id,&amp;msg1,sizeof(msg1.mtext),IPC_NOWAIT);
                printf("请输入进程id:");
                scanf("%d",&amp;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;
}
</code></pre>
<pre><code>
#include&lt;stdio.h&gt;
#include&lt;signal.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/ipc.h&gt;
#include &lt;sys/msg.h&gt;
#include &lt;unistd.h&gt;
int key;
int msg_id,id;
struct msgbuf {
               long mtype;       /* message type, must be &gt; 0 */
               intmtext;    /* message data */
         };
struct msgbuf msg1;         
//信号处理函数
void sig_handler(int signal)
{
        //如果是接受到的信号是SIGUSR1,则执行
        if(signal == SIGUSR2){
                printf("22\n");
                msgrcv(msg_id,&amp;msg1,sizeof(msg1.mtext),0,0);
                       
                printf("process A id is %d\n",msg1.mtext);
        }



}
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",&amp;id);
        //发送消息
        kill(id,SIGUSR1);
        signal(SIGUSR2,sig_handler);
       
        while(1);

        return 0;
}

</code></pre><br><br>
来源:https://www.cnblogs.com/lradian/p/18866181
頁: [1]
查看完整版本: 消息队列练习