共享内存的问题 请高手指教
extern "C " {
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <getopt.h>
}
void usage(int argc, char** argv)
{
printf( "%s arguments\n ", argv[0]);
printf( "-h help mode.\n ");
printf( "-c create shm.\n ");
printf( "-m <message> write message into shm.\n ");
printf( "-r read message from shm.\n ");
printf( "-d destroy shm.\n ");
}
typedef enum {SHM_UNKNOW = 0, SHM_CREATE, SHM_DESTROY, SHM_WRITE, SHM_READ} SHM_MODE;
#define SHM_KEY 1234
#define SHM_SIZE 1000
/**IPC_ALLOC is solaris specific
*/
#if !defined( IPC_ALLOC )
#define IPC_ALLOC IPC_CREAT
#endif
/** create shm with SHM_KEY
* @return shmid
*/
int shm_create();
/** open shm with SHM_KEY
* @return shmid
*/
int shm_open();
/** destroy shm which shm key is SHM_KEY
*/
void shm_destroy(int shmid);
/** write a string into shm, the string should be teminated by null.
*/
void shm_write(int, char*);
/** read message from shm
@param the shmid
*/
void shm_read(int shmid);
/** detach from shm
*/
void shm_close(const void* root);
int main(int argc, char** argv)
{
SHM_MODE shm_mode = SHM_UNKNOW;
char* message = NULL;
int shmid = 0;
int opt = 0 ;
extern int optind ;
extern char* optarg ;
while ((opt = getopt (argc, argv, "hcrm:d ")) != EOF) {
switch (opt) {
case 'h ' : // help mode
usage(argc, argv);
return 0;
case 'c ' : //create mode
shm_mode = SHM_CREATE;
break;
case 'd ' : //destroy mode
shm_mode = SHM_DESTROY;
break;
case 'r ': //read message
shm_mode = SHM_READ;
break;
case 'm ': //write message
shm_mode = SHM_WRITE;
message = (char*)optarg;
break;
default :
usage(argc, argv);
return -1;
}
}
switch (shm_mode){
case SHM_CREATE:
shmid = shm_create();
break;
case SHM_DESTROY:
shmid = shm_open();
shm_destroy(shmid);
break;
case SHM_READ:
shmid = shm_open();
shm_read(shmid);
break;
case SHM_WRITE:
shmid = shm_open();
shm_write(shmid, message);
break;
default:
usage(argc, argv);
return -1;
}
}
int shm_create()
{
int shmid = shmget (SHM_KEY, SHM_SIZE, IPC_CREAT | 0666);
if(shmid < 0){
printf( "failed to allocate shm %s(%d)\n ", strerror(errno));
}
return shmid;
}
int shm_open()
{
int shmid = shmget (SHM_KEY, SHM_SIZE, IPC_ALLOC | 0666);
if(shmid < 0){
printf( "failed to open shm %s(%d)\n ", strerror(errno));
}
return shmid;
}
void shm_destroy(int shmid)
{
if(shmid <= 0)
return;
struct shmid_ds buf ;
int ret = shmctl (shmid, IPC_RMID, &buf) ;
if (ret < 0){
printf( "failed to destroy shm %s(%d)\n ", strerror(errno));
}
}
void shm_write(int shmid, char* message)
{
if(shmid <= 0)
return;
void* root = shmat (shmid, 0, 0);
if (root == (char*)-1){
printf( "failed to attach shm %s(%d)\n ", strerror(errno));
return;
}
memset(root, 0, SHM_SIZE);
strncpy((char*)root, message, SHM_SIZE - 1);
shm_close(root);
}
void shm_read(int shmid)
{
if(shmid <= 0)
return;
char* root = (char*)shmat (shmid, 0, 0);
if (root == (char*)-1){
printf( "failed to attach shm %s(%d)\n ", strerror(errno));
return;
}
if(strlen(root) > 0)
printf( "%s\n ", root);
else
printf( "SHM is empty!\n ");
shm_close(root);
}
void shm_close(const void* root)
{
if(root == NULL)
return;
int ret = shmdt (root);
if(ret < 0){
printf( "failed to detach shm %s(%d)\n ", strerror(errno));
}
}
小弟出学共享内存
用g++ -g -o shm_example main.cc 编译后
没有共享内存时 运行 shm_example -r 时能正常输出SHM is empty!
但是同时自动建一个共享内存 这是我不想要的
怎么才能在没有共享内存时只输出信息 而不新建共享内存
小弟在此谢过
[解决办法]
你在 shm_read前已经创建共享内存了,并且已经shmat上。
只是strlen的判断=0而且,表示的根本不是SHM is empty!