dtcms模板 设计模式 ClickHouse 细胞因子 typeAliases 图像处理 pandas docker安装部署 tkinter mtu原理 hyperlink jboss gtk vue响应式 oracle取第一条数据 js获取月份 java上传图片 kubernetes架构 python教学 mysql 连接 java在线教程 java线程中断 java字符串相等 linuxsudo命令 php实例代码 刺激战场脚本 maxtoc4d 识别音乐的软件 lol语音包 视频后期处理软件 方正徐静蕾字体 ps蒙版抠图 lol改皮肤软件 内存条是什么 pr脱机文件怎么恢复 sprutcam 微信昵称特殊符号 如何加入工作组 网页播放器 lxe文件怎么打开
当前位置: 首页 > 学习教程  > 编程语言

信号发送带复杂数据

2020/9/19 14:34:02 文章标签:

父子进程间信号发送

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <string.h>
#include <stdlib.h>
//信息结构体
struct Info
{
	char name[20];
	int age;
	float score;
};
void func(int sig)
{
	printf("标准响应函数收到信号:%d\n",sig );
}

void act_func(int sig,siginfo_t *siginfo,void *ptr)
{
	//如果是sigqueue函数方式的信号发送。那么我们是可以拿到数据的
	if(siginfo->si_code == SI_QUEUE)
	{
		printf("获取到信号【%d】发送过来的数据:\n",sig);
		struct Info *data =(struct Info *)siginfo->si_ptr;
		printf("name:%s,age:%d,score:%2f\n",data->name,data->age,data->score );
	}
}
int main(int argc, char const *argv[])
{	//为什么要在创建子进程之前定义?
	//因为在程序运行过程中,创建子进程之后,子进程与父进程并不会共享同一块内存,会导致在接收的时候出现问题
	struct Info data = {"zhangsan",20,99.9};//栈空间 
	// struct Info *data = malloc(sizeof(struct Info));//堆空间
	// strcpy(data->name,"zhangsan");
	// data->age = 22;
	// data->score = 99.2;
	pid_t x = fork();
	if(x > 0)
	{
		sleep(1);
		union sigval value;
		value.sival_ptr = &data;
		sigqueue(x,SIGUSR1,value);
	}
	else if(x == 0)
	{
	//定义一个struct sigaction结构体变量
	struct sigaction act;
	//设置一个标准响应函数
	act.sa_handler = func;
	//设置一个扩展响应函数
	act.sa_sigaction = act_func;
	//设置掩码(可以不用)
	sigset_t myset;
	sigaddset(&myset,SIGUSR2);
	act.sa_mask = myset;
	//设置响应方式是扩展响应函数
	act.sa_flags |= SA_SIGINFO;

	//注册普通信号响应函数
	// signal(SIGUSR1,func);
	//注册扩展响应函数
	sigaction(SIGUSR1,&act,NULL);


	pause();
	}
	else 
	{
		perror("fork");

	}
	return 0;
}

本文链接: http://www.dtmao.cc/news_show_200126.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?