现在linux使用的进程间通信方式:
(1)管道(pipe)和命名管道(FIFO)
(2)信号(signal)
(3)消息队列
(4)共享内存
(5)信号量 ( 1 ~ 5 是本地间通信 )
(6)套接字(socket) ( 网络之间 )
1. 消息队列
使用 ipcs 查看系统消息队列 、 共享内存段 、 信号量数组
这三者归 系统管理, 不属于进程管理。
作用:用来创建和访问一个消息队列
int msgget(key_t key, int msgflg);
参数:
key: 某个消息队列的名字 msgflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的 如果操作成功,msgget将返回一个非负整数,即该消息队列的标识码;如果失败,则返回“-1”
实际使用 例如:
发送端 : 发送的数据是一个固定的结构体
//消息结构体
typedef struct myxiaoxibuf {
long mtype; /* message type, must be > 0 */
char mtext[50]; /* message data */
}MYXIAOXIBUF;
int msgid = msgget((key_t)1001, IPC_CREAT | 0777);
if (msgid == -1)
{
perror(" msgid error ! ");
}
else
{
cout << " 创建 msgid 成功!" << endl;
}
MYXIAOXIBUF buf = { 0 };
for (int i = 0; i < 3; i++)
{
char a[100] = { 0 };
sprintf(buf.mtext, "Hello %d", i);
buf.mtype = 1;
//添加一条信息进 消息队列
if (msgsnd(msgid, &buf, sizeof(MYXIAOXIBUF), 0) == 0)
{
cout << "发送成功!" << endl;
}
else if (msgsnd(msgid, &buf, sizeof(MYXIAOXIBUF), 0) == -1)
{
perr