首页 > 系统相关 >进程A与B互传信号并做出反应

进程A与B互传信号并做出反应

时间:2024-05-28 09:10:51浏览次数:20  
标签:队列 int 互传 消息 信号 进程 include

进程A与B互传信号并做出反应

练习:要求进程A创建一条消息队列之后向进程B发送SIGUSR1信号,进程B收到该信号
之后打开消息队列并把进程的PID作为消息写入到消息队列中,要求进程B在写入消息之后,
发SIGUSR2信号给进程A,进程A收到该信号则从消息队列中读取消息并输出消息正文的内
容。

进程A:

/********************************************************************
*          
*          file name:       process_a.c
*          author:         [email protected] 
*          date:            2024年5月27日
*          function:        练习:要求进程A创建一条消息队列之后向进程B发送SIGUSR1信号,进程B收到该信号
                                 之后打开消息队列并把进程的PID作为消息写入到消息队列中,要求进程B在写入消息之后,
                                 发SIGUSR2信号给进程A,进程A收到该信号则从消息队列中读取消息并输出消息正文的内
`````````````````````````````````容。

*          note:           none
*
*        CopyRight (c)      [email protected]      All Right Reseverd     
*          
********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <signal.h>


int msgid;


/*****************************************************************************
*                 函数名称:     signal2_handler
*                 函数功能:    接受进程B发来的SIGUSR2信号
*                 函数参数:	   int signo
*                 返回结果:    NONE
*                 注意事项:    NONE
*                 函数作者:    [email protected] 
*                 创建日期:    2024年5月27日
*                 修改历史:    2024年5月27日
*                 函数版本:    1.0
*
*****************************************************************************/
void signal2_handler(int signo)
{
  struct
  {
    long mesg_type;
    char mesg_text[256];
  } mesgbuf;
  if (msgrcv(msgid, &mesgbuf, sizeof(mesgbuf.mesg_text), 1, 0) != -1)
  {
    printf("process B  message_: %s\n", mesgbuf.mesg_text);
  }
  else
  {
    perror("msgrcv");
  }
}

int main()
{
  key_t key = ftok(".", 0xFFFFFF01);
  int msgid = msgget(key, 0666 | IPC_CREAT);
  if (msgid == -1)
  {
    perror("msgget");
    exit(EXIT_FAILURE);
  }
  // 输出创建成功的消息队列的key
  printf("msg key: %#x\n", key);

  signal(SIGUSR2, signal2_handler);

  system("killall -SIGUSR1 pro_b");

  printf("Sent SIGUSR1 to Process B\n");

  while (1)
  {
    sleep(1);
  }

  return 0;
}

进程B:

/********************************************************************
*
*          file name:       process_b.c
*          author:         [email protected]
*          date:            2024年5月27日
*          function:        练习:要求进程A创建一条消息队列之后向进程B发送SIGUSR1信号,进程B收到该信号
                                 之后打开消息队列并把进程的PID作为消息写入到消息队列中,要求进程B在写入消息之后,
                                 发SIGUSR2信号给进程A,进程A收到该信号则从消息队列中读取消息并输出消息正文的内
​`````````````````````````````````容。

*          note:           none
*
*        CopyRight (c)      [email protected]      All Right Reseverd
*
********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <signal.h>

#define MSG_SIZE 256

int msgid;
/*****************************************************************************
 *                 函数名称:     signal1_handler
 *                 函数功能:    接受进程A发来的SIGUSR1信号
 *                 函数参数:	   int signo
 *                 返回结果:    NONE
 *                 注意事项:    NONE
 *                 函数作者:    [email protected]
 *                 创建日期:    2024年5月27日
 *                 修改历史:    2024年5月27日
 *                 函数版本:    1.0
 *
 *****************************************************************************/

void sign1_handler(int signo)
{
  struct
  {
    long mtype;
    char mtext[MSG_SIZE];
  } msgbuf;

  msgid = msgget(ftok(".", 0xFFFFFF01), 0666);
  if (msgid == -1)
  {
    perror("msgget");
    exit(EXIT_FAILURE);
  }

  sprintf(msgbuf.mtext, "%d", getpid());
  msgbuf.mtype = 1;

  if (msgsnd(msgid, &msgbuf, MSG_SIZE, 0) == -1)
  {
    perror("msgsnd");
  }

  system("killall -SIGUSR2 pro_a");
  printf("Process B sent SIGUSR2 to process A\n");
}

int main()
{
  signal(SIGUSR1, sign1_handler);

  while (1)
  {
    sleep(1);
  }

  return 0;
}

标签:队列,int,互传,消息,信号,进程,include
From: https://www.cnblogs.com/luo-tt/p/18217068

相关文章

  • 【.NET深呼吸】线程信号量(Semaphore)
    Semaphore类可以控制某个资源允许访问的线程数,Semaphore有命名式的,也有不命名的;如果不考虑跨进程工作,一般在代码中使用不命名方式即可。信号量有点类似于等待句柄,某个线程如果调用了WaitOne方法,这个线程就会暂停,并且等待有可用的信号量时才会继续执行;某个线程调用Release方法,就......
  • 系统编程练习题----使用消息队列实现两个进程之间的通信
    目录题目思路代码展示进程A进程B结果展示题目要求进程A创建一条消息队列之后向进程B发送SIGUSR1信号,进程B收到该信号之后打开消息队列并写入一段信息作为消息写入到消息队列中,要求进程B在写入消息之后,发SIGUSR2信号给进程A,进程A收到该信号则从消息队列中读取消息并输出消息正文......
  • 【Linux学习】进程间通信 (2) —— 信号
    下面是有关进程通信中信号的相关介绍,希望对你有所帮助!小海编程心语录-CSDN博客目录1.信号 1.1概念 1.2信号的产生 1.3信号的处理方式 2.函数 2.1kill()函数 2.2 signal()函数 2.3 sigaction()函数 2.4 sigprocmask()函数 2.5sigqueue()函数......
  • 基于FPGA的函数信号发生器设计
    本科时期的一个课设,现在将他分享出来,写了很详细的文章,可以直接拿去使用:设计采用波形查找表和相位累加器的方法实现DDS,查找表的数据位宽为8位,采样点数为4096。波形产生范围是100Hz-20MHz,最小频率间隔为1Hz,用8个数码管显示频率,可产生正弦波、方波、三角波,波形用两个led显示,select......
  • 《TCP/IP网络编程》(第十章)多进程服务器端(2)
    基于进程的并发服务器我们将扩展之前的回声服务器,使其可以同时向多个客户端体提供服务,实现模型如下图所示即每当有客户端向服务器请求服务时,服务器端都创建一个子进程为其提供服务,比如有5个客户端请求服务,则创建个5子进程。通过fork()复制的文件描述符下图是父进程调用......
  • 进程间通信(管道)、多线程理论、开设多线程的两种方式、threading介绍、线程之间共享数
    【一】进程间通信(管道)借助于消息队列,进程可以将消息放入队列中,然后由另一个进程从队列中取出。这种通信方式是非阻塞的,即发送进程不需要等待接收进程的响应即可继续执行。multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的进程间通信(IPC)有两种方式:队列......
  • 互斥锁、进程间通信(IPC)、队列(queue)模块、队列实现进程间通信、生产者和消费者模型
    【一】互斥锁【1】什么是进程同步(互斥锁)互斥锁(Mutex)是一种用于多线程编程中控制对共享资源访问的机制。其作用是保证在同一时刻只有一个线程在访问共享资源,从而避免多个线程同时读写数据造成的问题。互斥锁的基本原理是在对共享资源进行访问前加锁,使得其他线程无法访问该......
  • 僵尸进程和孤儿进程、守护进程
    【一】僵尸进程和孤儿进程【1】引入我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。当一个进程完成它的工作终止之后,它的父进程需要调用wait()或......
  • postgressq——四种进程间锁(4)
    进程间锁在PostgreSQL里有四种类型的进程间锁:Spinlocks:自旋锁,其保护的对象一般是数据库内部的一些数据结构,是一种轻量级的锁。LWLocks:轻量锁,也是主要用于保护数据库内部的一些数据结构,支持独占和共享两种模式。Regularlocks:又叫heavyweightlocks,也就是我们常说的表锁......
  • 【语音处理】语音信号时域频域分析,降噪滤波,端点检测,特征提取附Matlab代码
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......