前言
进程间的通信:信号和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;
}
注意:上述的代码这是一部分,只是实现大概进程间利用消息队列进行通信,还有一些系统的头文件还未包含!
- 每天一句:人生莫惧少年贫!