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