进程间通信----信号、System V消息队列

前言

进程间的通信:信号和System V消息队列


我主要记录一下信号和消息队列的一些常用的函数接口

信号

#信号:信号的有三种处理方式,
1.捕获信号(将捕获的信号和函数关联起来)
2.系统默认处理
3.忽略

信号的函数接口:
1.kill - send signal to a process
发送信号给一个进程
SYNOPSIS
头文件
#include <sys/types.h>
#include <signal.h>
函数原型
int kill(pid_t pid, int sig);
参数:pid:要将信号发送给哪一个进程(进程号)
sig:要发送的信号
2.
NAME
raise - send a signal to the caller
将信号发送给自己
SYNOPSIS
头文件
#include <signal.h>
函数原型
int raise(int sig);
参数:sig:要发送的信号
3.NAME
signal - ANSI C signal handling
捕获信号:改变信号的处理方式,将信号与函数关联起来
SYNOPSIS
#include <signal.h>
typedef void (*sighandler_t)(int);
上面是这个处理函数的新类型名定义
函数原型:
sighandler_t signal(int signum, sighandler_t handler);

System V消息队列

如何使用System V消息队列来进行通信:
使用步骤:
1.先向内核申请一个IPC的key(“许可证”)
2.通过IPC的key来创建或者打开IPC对象(这里的对象是指消息队列)
3.读/写/操作IPC对象

//从终端获取数据将数据保存到消息队列中
#define PATHNAME  "/home/china" 
#define PRO_ID	229

//自定义的结构体表示一个消息
struct msgbuf {
   long mtype;       /* 消息的类型 */
   char mtext[0];    /* 消息的内容 */ //柔性数组
};


int main()
{
	//生成一个IPC的key
	key_t key = ftok(PATHNAME ,PRO_ID);
	if(key == -1)
	{
		perror("ftok failed");
		exit(-1);
	}
	//利用key创建或者打开IPC对象
	int msg_id = msgget(key,IPC_CREAT | 0664);
	if(msg_id == -1)
	{
		perror("msgget failed");
		exit(-1);	
	}
	//发送一个消息到消息队列上面去
	char buf[256] = {0};
	fgets(buf,256,stdin);
	struct msgbuf *p = malloc(sizeof(*p) + strlen(buf) + 1);	
	p->mtype = 101;//类型由程序员自己定义
	
	
	memcpy(p->mtext,buf,strlen(buf)+1);
	printf("len = %ld\n",strlen(buf)+1);
	int ret = msgsnd(msg_id, (void *)p, strlen(buf)+1, 0);
	if(ret == -1)
	{
		perror("msgsnd failed");
		exit(-1);	
	}
	return 0;
}

//这是将消息队列中的数据读出来,这样简单的实现两个进程间的通信
#define PATHNAME  "/home/china" 
#define PRO_ID	229

//自定义的结构体表示一个消息
struct msgbuf {
   long mtype;       /* 消息的类型 */
   char mtext[1024];    /* 消息的内容 */ 
};


int main()
{
	//生成一个IPC的key
	key_t key = ftok(PATHNAME ,PRO_ID);
	if(key == -1)
	{
		perror("ftok failed");
		exit(-1);
	}
	//利用key创建或者打开IPC对象
	int msg_id = msgget(key,IPC_CREAT | 0664);
	if(msg_id == -1)
	{
		perror("msgget failed");
		exit(-1);	
	}
	//从指定的消息队列获取消息
	struct msgbuf buf; //存放读取到的消息

	ssize_t ret = msgrcv(msg_id, (void *)&buf, 1024, 0,0);
	if(ret == -1)
	{
		perror("msgrcv failed");
		exit(-1);	
	}else
	{
		printf("ret = %ld\n",ret);
		printf("type:%ld\n",buf.mtype);
		printf("data:%s\n",buf.mtext);
	}
	

	return 0;
}

注意:上述的代码这是一部分,只是实现大概进程间利用消息队列进行通信,还有一些系统的头文件还未包含!

  • 每天一句:人生莫惧少年贫!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值