消息队列和共享内存封装

发布时间:2012-11-25 16:08:41   来源:文档文库   
字号:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ERR_EXIT(m) do \

{ \

perror(m); \

exit(EXIT_FAILURE); \

} while(0)

#define MAX_SIZE 512

struct shm_text

{

int pid;

char mtext[MAX_SIZE];

};

int main()

{

int shmid;

void *shmAddr = NULL;

struct shm_text *shm_wr,*shm_rd;

shmid = shmget(ftok(".",0),sizeof(struct shm_text),0666|IPC_CREAT|IPC_EXCL);

if(shmid == -1)

{

shmid = shmget(ftok(".",0),sizeof(struct shm_text),0666|IPC_CREAT);

if(shmid == -1)

{

ERR_EXIT("shmget fail");

}

}

shmAddr = shmat(shmid,(void *)0,0);

if(shmAddr == (void *)-1)

{

ERR_EXIT("shmat fail");

}

shm_wr = (struct shm_text *)shmAddr;

bzero(shm_wr,MAX_SIZE);

do

{

fcntl(0,F_SETFL,O_NONBLOCK);

fcntl(1,F_SETFL,O_NONBLOCK);

if((fgets(shm_wr->mtext,MAX_SIZE,stdin) != NULL) && (strncmp(shm_wr->mtext,"quit",4) != 0))

{

printf("send:%s",shm_wr->mtext);

}

sleep(1);

if((strlen(shm_wr->mtext) > 0) && (strncmp(shm_wr->mtext,"quit",4) != 0))

{

printf("get server info:%s",shm_wr->mtext);

bzero(shm_wr,MAX_SIZE);

}

if((strncmp(shm_wr->mtext,"quit",4) == 0))

printf("client %s",shm_wr->mtext);

}while(strncmp(shm_wr->mtext,"quit",4) != 0);

int rlt = shmdt(shmAddr);

if(rlt == -1)

{

ERR_EXIT("Delete fail1");

}

printf("client close\n");

return 0;

}

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ERR_EXIT(m) do \

{ \

perror(m); \

exit(EXIT_FAILURE); \

} while(0)

#define MAX_SIZE 512

struct msg_buf

{

int pid;

char mtext[MAX_SIZE];

};

main()

{

key_t key;

struct msg_buf msg_sbuf,msg_mbuf;

int msgid;

int rlt;

key = ftok(".",'c');

msgid = msgget(key,IPC_CREAT|IPC_EXCL|0666);

if(msgid == -1)

{

msgid = msgget(key,IPC_CREAT|0666);

if(msgid == -1)

{

ERR_EXIT("msgget fail");

}

}

bzero(&msg_sbuf,sizeof(struct msg_buf));

bzero(&msg_mbuf,sizeof(struct msg_buf));

msg_sbuf.pid = 10;

printf("msgid = %d\n",msgid);

do

{

fcntl(0,F_SETFL,O_NONBLOCK);

fcntl(1,F_SETFL,O_NONBLOCK);

fcntl(msgid,F_SETFL,O_NONBLOCK);

fgets(msg_sbuf.mtext,MAX_SIZE,stdin);

if(strlen(msg_sbuf.mtext) > 0 && (strncmp(msg_mbuf.mtext,"quit",4) != 0))

{

printf("send info:%s",msg_sbuf.mtext);

rlt = msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),IPC_NOWAIT);

if(rlt == -1)

{

perror("msgsend error\n");

}

}

sleep(1);

bzero(&msg_sbuf.mtext,512);

rlt = msgrcv(msgid,&msg_sbuf,sizeof(struct msg_buf),0,IPC_NOWAIT|MSG_NOERROR);

if(rlt > 0 && (strncmp(msg_sbuf.mtext,"quit",4) != 0))

{

printf("rcv info:%s",msg_sbuf.mtext);

bzero(&msg_mbuf,sizeof(struct msg_buf));

bzero(&msg_sbuf.mtext,512);

}

if(strncmp(msg_sbuf.mtext,"quit",4) == 0)

printf("close!\n");

}while(strncmp(msg_sbuf.mtext,"quit",4) != 0);

rlt = msgctl(msgid,IPC_RMID,NULL);

if(rlt == -1)

{

ERR_EXIT("Delete error");

}

}

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ERR_EXIT(m) do \

{ \

perror(m); \

exit(EXIT_FAILURE); \

} while(0)

#define MAX_SIZE 512

struct shm_text

{

int pid;

char mtext[MAX_SIZE];

};

int main()

{

int shmid;

void *shmAddr = NULL;

struct shm_text *shm_wr,*shm_rd;

shmid = shmget(ftok(".",0),sizeof(struct shm_text),0666|IPC_CREAT|IPC_EXCL);

if(shmid == -1)

{

shmid = shmget(ftok(".",0),sizeof(struct shm_text),0666|IPC_CREAT);

if(shmid == -1)

{

ERR_EXIT("shmget fail");

}

}

shmAddr = shmat(shmid,(void *)0,0);

if(shmAddr == (void *)-1)

{

ERR_EXIT("shmat fail");

}

shm_wr = (struct shm_text *)shmAddr;

bzero(shm_wr,MAX_SIZE);

printf("begin....\n");

do

{

fcntl(0,F_SETFL,O_NONBLOCK);

fcntl(1,F_SETFL,O_NONBLOCK);

if((fgets(shm_wr->mtext,MAX_SIZE,stdin) != NULL) && (strncmp(shm_wr->mtext,"quit",4) != 0))

{

printf("send:%s",shm_wr->mtext);

}

sleep(1);

if((strlen(shm_wr->mtext) > 0) && (strncmp(shm_wr->mtext,"quit",4) != 0))

{

printf("get client info:%s",shm_wr->mtext);

bzero(shm_wr,MAX_SIZE);

}

if((strncmp(shm_wr->mtext,"quit",4) == 0))

printf("server %s",shm_wr->mtext);

}while(strncmp(shm_wr->mtext,"quit",4) != 0);

int rlt = shmdt(shmAddr);

if(rlt == -1)

{

ERR_EXIT("Delete fail1");

}

printf("server close\n");

return 0;

}

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ERR_EXIT(m) do \

{ \

perror(m); \

exit(EXIT_FAILURE); \

} while(0)

#define MAX_SIZE 512

struct msg_buf

{

int pid;

char mtext[MAX_SIZE];

};

main()

{

key_t key;

struct msg_buf msg_sbuf,msg_mbuf;

int msgid;

int rlt;

key = ftok(".",'c');

msgid = msgget(key,IPC_CREAT|IPC_EXCL|0666);

if(msgid == -1)

{

msgid = msgget(key,IPC_CREAT|0666);

if(msgid == -1)

{

ERR_EXIT("msgget fail");

}

}

bzero(&msg_sbuf,sizeof(struct msg_buf));

bzero(&msg_mbuf,sizeof(struct msg_buf));

msg_sbuf.pid = 10;

printf("msgid = %d\n",msgid);

do

{

fcntl(0,F_SETFL,O_NONBLOCK);

fcntl(1,F_SETFL,O_NONBLOCK);

fcntl(msgid,F_SETFL,O_NONBLOCK);

fgets(msg_sbuf.mtext,MAX_SIZE,stdin);

if((strlen(msg_sbuf.mtext) > 0) && (strncmp(msg_mbuf.mtext,"quit",4) != 0))

{

printf("send info:%s",msg_sbuf.mtext);

rlt = msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),IPC_NOWAIT);

if(rlt == -1)

{

perror("msgsend error\n");

}

}

sleep(1);

bzero(&msg_sbuf.mtext,512);

rlt = msgrcv(msgid,&msg_mbuf,sizeof(msg_mbuf.mtext),0,IPC_NOWAIT|MSG_NOERROR);

if(rlt > 0 && (strncmp(msg_mbuf.mtext,"quit",4) != 0))

{

printf("rcv info:%s",msg_mbuf.mtext);

bzero(&msg_mbuf,sizeof(struct msg_buf));

bzero(&msg_sbuf.mtext,512);

}

if(strncmp(msg_sbuf.mtext,"quit",4) == 0)

printf("close!\n");

/*else

bzero(&msg_sbuf.mtext,512);*/

}while(strncmp(msg_sbuf.mtext,"quit",4) != 0);

rlt = msgctl(msgid,IPC_RMID,NULL);

if(rlt == -1)

{

ERR_EXIT("Delete error");

}

}

本文来源:https://www.2haoxitong.net/k/doc/11a74f0a16fc700abb68fca3.html

《消息队列和共享内存封装.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式