一、IPC
XSI IPC即: 消息队列,信号量,共享存储器。
XSI IPC 源于系统V的IPC功能,有自己的名字空间,所以用的所自己的系统调用。
1.标示符和键
标示符是IPC对象的内部名,为了要多个进程合作需要一个共知的外部名,于是使用了键。
键数据类型:key_t 长整型
键可以自己指定也可以用ftok函数创建。
函数原型: key_t ftok(const char *path, int id);
2。权限结构
XSI IPC为每个IPC都设置了了一个 ipc_perm结构,用来规定权限和所有者
点击(
此处)折叠或打开
-
struct ipc_perm {
-
key_t __key; /* Key supplied to msgget(2) */
-
uid_t uid; /* Effective UID of owner */
-
gid_t gid; /* Effective GID of owner */
-
uid_t cuid; /* Effective UID of creator */
-
gid_t cgid; /* Effective GID of creator */
-
unsigned short mode; /* Permissions */
-
unsigned short __seq; /* Sequence number */
-
};
3. IPC是系统范围内的,没有访问计数,可以用ipcs -l显示相关限制。
IPC么有用文件系统的名字空间,所以不能用文件系统的相关调用来访问,也不能使用文件描述符,所以也不能进行多路转接:
这使得难于一次使用多个IPC结构,以及在文件系统或设备I/O中使用IPC结构。
优点:可靠,流是受控的,面向记录,可以使用不是FIFO的方式处理数据
二 消息队列
点击(此处)折叠或打开
-
struct msqid_ds {
-
struct ipc_perm msg_perm; /* Ownership and permissions */
-
time_t msg_stime; /* Time of last msgsnd(2) */
-
time_t msg_rtime; /* Time of last msgrcv(2) */
-
time_t msg_ctime; /* Time of last change */
-
unsigned long __msg_cbytes; /* Current number of bytes in
-
queue (nonstandard) */
-
msgqnum_t msg_qnum; /* Current number of messages
-
in queue */
-
msglen_t msg_qbytes; /* Maximum number of bytes
-
allowed in queue */
-
pid_t msg_lspid; /* PID of last msgsnd(2) */
-
pid_t msg_lrpid; /* PID of last msgrcv(2) */
-
}
msg_ipc.h
-
#include <unistd.h>
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <errno.h>
-
#include <string.h>
-
#include <sys/ipc.h>
-
#include <sys/msg.h>
-
#include <sys/stat.h>
-
-
#define MSG_FILE "msg_ipc.h"
-
#define MSG_ID 199
-
#define MSG_LEN 512
-
-
struct my_msg
-
{
-
int msg_type;
-
char msg_text[MSG_LEN];
-
};
-
-
-
#define err_msg(MSG) { \
-
perror(MSG); \
-
exit(errno); \
-
}
-
-
#define DEBUG
-
#ifdef DEBUG
-
#define DPRINT(CHAR,INT) printf(CHAR" %d \n", INT)
-
#endif
server
-
#include "msg_ipc.h"
-
#define MSG_TYPE 2
-
#define MODE_PERM S_IRUSR|S_IWUSR
-
int main()
-
{
-
key_t msg_key;
-
struct my_msg msg;
-
int msg_id;
-
char msg_text[MSG_LEN] = "buffer need snd test";
-
-
if((msg_key=ftok(MSG_FILE, MSG_ID)) == -1)
-
err_msg("ftok error:");
-
DPRINT("msg_key = ", msg_key);
-
-
if((msg_id=msgget(msg_key, MODE_PERM|IPC_CREAT|IPC_EXCL)) == -1)
-
err_msg("msgget failed");
-
-
memset(&msg, '\0', sizeof(struct my_msg));
-
msg.msg_type = MSG_TYPE;
-
memcpy(msg.msg_text, msg_text, sizeof(msg_text));
-
-
if(msgsnd(msg_id, &msg, sizeof(msg.msg_text), 0) == -1)
-
{
-
printf(" msg snd_error: %s", strerror(errno));
-
if(msgctl(msg_id, IPC_RMID, NULL) == -1)
-
err_msg("rm msg queue failer");
-
}
-
-
printf("snd msg success\n");
-
return 0;
-
}
cline:
-
#include "msg_ipc.h"
-
#define MODE_PERM S_IRUSR|S_IWUSR
-
int main()
-
{
-
key_t msg_key;
-
int msg_id;
-
struct my_msg msg;
-
int count;
-
-
if((msg_key=ftok(MSG_FILE, MSG_ID)) == -1)
-
err_msg("ftok err lient");
-
if((msg_id=msgget(msg_key, MODE_PERM)) == -1)
-
err_msg("msgget err clinet");
-
if((count=msgrcv(msg_id, &msg, MSG_LEN, 0, IPC_NOWAIT)) == -1)
-
err_msg("msgrcv error");
-
printf("receve %d msg: %s\n", count, msg.msg_text);
-
-
return 0;
-
}
阅读(357) | 评论(0) | 转发(0) |