//read.cpp
#include <sys/shm.h>
#include <unistd.h>
#include <iostream>
#define PATH "/tmp/unixdomain"
using namespace std;
struct share_mem {
int rw_flag;
char data[20];
};
int main(int argc, const char* argv[]) {
key_t k = ftok(PATH, 1);
if(-1 == k) {
std::cout << "create key fail" << std::endl;
exit(-1);
}
std::cout << "key : " << k << std::endl;
int shm_id = shmget(k, sizeof(share_mem), IPC_CREAT|0640);
if(-1 == shm_id) {
std::cout << "create shm fail" << std::endl;
exit(-1);
}
std::cout << "create shm success" << std::endl;
share_mem* pBuf = (share_mem*)shmat(shm_id, NULL, 0);
if(-1 == (int)pBuf) {
std::cout << "map shm fail" << std::endl;
exit(-1);
}
std::cout << "map shm success" << std::endl;
pBuf->rw_flag = 0;
while(1) {
if(1 == pBuf->rw_flag)
break;
else
sleep(1);
}
std::cout << "read:" << pBuf->data << std::endl;
if(-1 == shmdt(pBuf)) {
std::cout << "delete shm fail" << std::endl;
exit(-1);
}
std::cout << "delete shm success" << std::endl;
shmctl(shm_id, IPC_RMID, NULL);
return 0;
}
//write.cpp
#include <sys/shm.h>
#include <unistd.h>
#include <iostream>
#define PATH "/tmp/unixdomain"
using namespace std;
struct share_mem {
int rw_flag;
char data[20];
};
int main(int argc, const char* argv[]) {
key_t k = ftok(PATH, 1);
if(-1 == k) {
std::cout << "create key fail" << std::endl;
exit(-1);
}
std::cout << "key : " << k << std::endl;
int shm_id = 0;
while(1) {
shm_id = shmget(k, sizeof(share_mem), 0640);
if(-1 == shm_id)
sleep(1);
else
break;
}
std::cout << "get shm success" << std::endl;
share_mem* pBuf = (share_mem*)shmat(shm_id, NULL, 0);
if(-1 == (int)pBuf) {
std::cout << "map shm fail" << std::endl;
exit(-1);
}
std::cout << "map shm success" << std::endl;
strcpy(pBuf->data, "this is shm test");
std::cout << "write:" << pBuf->data << std::endl;
pBuf->rw_flag = 1;
if(-1 == shmdt(pBuf)) {
std::cout << "delete shm fail" << std::endl;
exit(-1);
}
std::cout << "delete shm success" << std::endl;
return 0;
}