目录
一:需求
1.程序运行开辟ABCD 4进程
2.A进程发送信号SIGUSR1 携带数据2001 给B进程
3.B进程收到数据2001 对2001进行+1操作 发送信号SIGUSR2 携带数据2002 给C进程
4.C进程收到数据2002 对2002进行+1操作 发送信号SIGRTMIN 携带数据2003 给D进程
5.D进程收到数据2003 对2003进行+1操作 发送信号SIGUSR2 携带数据2004 给C进程
6.A进程收到信号传递数据2004 在控制台打印最终数据结果
二:实现
#include<iostream>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
//保存区分 父亲和孩子
int father_flag = 0;
int child_flag = 0;
pid_t pid = 0;
void signal_process(int num, siginfo_t* info, void* vo);
int main()
{
pid = fork();
if (pid > 0)//A进程 绑定SIGUSR2 发送SIGUSR1
{
//绑定SIGUSR2 D给A的 所以A要绑定这个信号
struct sigaction sct2;
sct2.sa_sigaction = signal_process;
sct2.sa_flags = SA_SIGINFO;
sigaction(SIGUSR2, &sct2, NULL);
std::cout << "A进程 pid = " << getpid() << endl;
child_flag = pid;//保存A进程孩子 B的pid
sleep(3); //延时 让BCD三个进程陆续创建成功并且绑定信号成功
union sigval sig_v;
sig_v.sival_int = 2001;
sigqueue(child_flag, SIGUSR1, sig_v);
while (1) {}//不退出进程
}
else if (pid == 0)//B进程 绑定SIGUSR1 发SIGUSR2
{
std::cout << "B进程 pid = " << getpid() << endl;
pid = fork();
if (pid > 0)//B进程
{
struct sigaction sct2;
sct2.sa_sigaction = signal_process;
sct2.sa_flags = SA_SIGINFO;
sigaction(SIGUSR1, &sct2, NULL);
child_flag = pid;
father_flag = getppid();
while (1){}
}
else if (pid == 0)//C进程 绑定SIGUSR2 发SIGRTMIN
{
struct sigaction sct2;
sct2.sa_sigaction = signal_process;
sct2.sa_flags = SA_SIGINFO;
sigaction(SIGUSR2, &sct2, NULL);
std::cout << "C进程 pid = " << getpid() << endl;
pid = fork();
if (pid > 0)
{
child_flag = pid;
father_flag = getppid();
while (1){}
}
else if (pid == 0)//D进程 绑定SIGRTMIN 发SIGUSR2
{
struct sigaction sct2;
sct2.sa_sigaction = signal_process;
sct2.sa_flags = SA_SIGINFO;
sigaction(SIGRTMIN, &sct2, NULL);
std::cout << "D进程 pid = " << getpid() << endl;
father_flag = getppid();
while (1){}
}
}
}
return 0;
}
void signal_process(int num, siginfo_t* info, void* vo)
{
int value = info->si_int;
if (father_flag != 0 && child_flag != 0)//要么B 要么C
{
std::cout << "pid = " << getpid() << "value = " << value << endl;
if (num == 10)//确定B进程
{
union sigval sig_v;
sig_v.sival_int = value + 1;
sigqueue(child_flag, SIGUSR2, sig_v);
}
else if (num == 12)//确定C进程
{
union sigval sig_v;
sig_v.sival_int = value + 1;
sigqueue(child_flag, SIGRTMIN, sig_v);
}
}
else if (father_flag == 0 && child_flag != 0)//A进程
{
std::cout << "主进程 pid = " << getpid() << "value = " << value << endl;
}
else if (father_flag != 0 && child_flag == 0)//D进程
{
std::cout << "pid = " << getpid() << "value = " << value << endl;
if (num == 34)
{
union sigval sig_v;
sig_v.sival_int = value + 1;
//getpgid 返回 一个进程组组长ID A进程
sigqueue(getpgid(father_flag),SIGUSR2,sig_v);
}
}
else
{
std::cout << "这里是不会被执行的" << endl;
}
}
三:测试
VM虚拟机与VS2019 二者的进程 也会出现信号冲突
需要点击继续按钮,继续执行
按照要求完成进程间通信
信号实现 数据传递