创建消息通信的基本步骤:
1、(key = ftok(/usr1/test/filename,'z')),基于文件,创建唯一的key,文件名要存在
2、根据唯一的key值,创造消息队列 msqid = msgget(key, IPC_CREAT|0777),得到消息id
3、配置消息,并调用发生函数发送消息
msg.mtype = 999; // 客户端接收的消息类型
sprintf(msg.mtext, "hello, I'm server %d", getpid());
msgsnd(msqid, &msg, sizeof(msg.mtext), 0);
4、接收特定类型888的消息,存在msg结构体中,msgrcv(msqid, &msg, 256, 888, 0);// 返回类型为888的第一个消息
创建信号量的基本步骤
1、key = ftok(".", 'z') 获取唯一的key值
2、sem_id = semget(key, 1, IPC_CREAT|0666) 根据key值创建信号量,得到信号量id
3、根据id初始化信号量
4、在不同的进程中,执行程序前等待信号量,执行后释放信号量,最终记得删除信号量
附:
信号量相关函数定义:
// 联合体,用于semctl初始化
union semun
{
int val; /*for SETVAL*/
struct semid_ds *buf;
unsigned short *array;
};
// 初始化信号量
int init_sem(int sem_id, int value)
{
union semun tmp;
tmp.val = value;
if(semctl(sem_id, 0, SETVAL, tmp) == -1)
{
perror("Init Semaphore Error");
return -1;
}
return 0;
}
// P操作:(等待信号量)
// 若信号量值为1,获取资源并将信号量值-1
// 若信号量值为0,进程挂起等待
int sem_p(int sem_id)
{
struct sembuf sbuf;
sbuf.sem_num = 0; /*序号*/
sbuf.sem_op = -1; /*P操作*/
sbuf.sem_flg = SEM_UNDO;
if(semop(sem_id, &sbuf, 1) == -1)
{
perror("P operation Error");
return -1;
}
return 0;
}
// V操作:(释放信号量)
// 释放资源并将信号量值+1
// 如果有进程正在挂起等待,则唤醒它们
int sem_v(int sem_id)
{
struct sembuf sbuf;
sbuf.sem_num = 0; /*序号*/
sbuf.sem_op = 1; /*V操作*/
sbuf.sem_flg = SEM_UNDO;
if(semop(sem_id, &sbuf, 1) == -1)
{
perror("V operation Error");
return -1;
}
return 0;
}
// 删除信号量集
int del_sem(int sem_id)
{
union semun tmp;
if(semctl(sem_id, 0, IPC_RMID, tmp) == -1)
{
perror("Delete Semaphore Error");
return -1;
}
return 0;
}
创建共享内存基本步骤
1、创建唯一的key
2、使用key创建共享内存,得到内存id
3、通过id,连接共享内存,得到指向内存的指针
4、操作该指针,可以读写共享内存
#include <sys/shm.h>
// 创建或获取一个共享内存:成功返回共享内存ID,失败返回-1
int shmget(key_t key, size_t size, int flag);
// 连接共享内存到当前进程的地址空间:成功返回指向共享内存的指针,失败返回-1
void *shmat(int shm_id, const void *addr, int flag);
// 断开与共享内存的连接:成功返回0,失败返回-1
int shmdt(void *addr);
// 控制共享内存的相关信息:成功返回0,失败返回-1
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);