锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
#include
#include
#include
int msgget(key_t key,int msgflg);
int msgsnd(int msgid,struct msgbuf *msgp,int msgsz,int msgflg);
int msgrcv(int msgid,struct msgbuf *msgp,int msgsz,
long msgtype,int msgflg);
int msgctl(Int msgid,int cmd,struct msqid_ds *buf);
struct msgbuf {
long msgtype; /* 娑堟伅綾誨瀷 */
鈥︹? /* 鍏朵粬鏁版嵁綾誨瀷 */
}
msgget鍑芥暟鍜宻emget涓鏍?榪斿洖涓涓秷鎭槦鍒楃殑鏍囧織.msgctl鍜宻emctl鏄娑堟伅榪涜鎺у埗. msgsnd鍜宮sgrcv鍑芥暟鏄敤鏉ヨ繘琛屾秷鎭氳鐨?msgid鏄帴鍙楁垨鑰呭彂閫佺殑娑堟伅闃熷垪鏍囧織. msgp鏄帴鍙楁垨鑰呭彂閫佺殑鍐呭.msgsz鏄秷鎭殑澶у皬. 緇撴瀯msgbuf鍖呭惈鐨勫唴瀹規(guī)槸鑷沖皯鏈変竴涓負(fù)msgtype.鍏朵粬鐨勬垚鍒嗘槸鐢ㄦ埛瀹氫箟鐨?瀵逛簬鍙戦佸嚱鏁癿sgflg鎸囧嚭緙撳啿鍖虹敤瀹屾椂鍊欑殑鎿嶄綔.鎺ュ彈鍑芥暟鎸囧嚭鏃犳秷鎭椂鍊欑殑澶勭悊.涓鑸負(fù)0. 鎺ユ敹鍑芥暟msgtype鎸囧嚭鎺ユ敹娑堟伅鏃跺欑殑鎿嶄綔.
濡傛灉msgtype=0,鎺ユ敹娑堟伅闃熷垪鐨勭涓涓秷鎭?澶т簬0鎺ユ敹闃熷垪涓秷鎭被鍨嬬瓑浜庤繖涓肩殑絎竴涓秷鎭?灝忎簬0鎺ユ敹娑堟伅闃熷垪涓皬浜庢垨鑰呯瓑浜巑sgtype緇濆鍊肩殑鎵鏈夋秷鎭腑鐨勬渶灝忎竴涓秷鎭? 鎴戜滑浠ヤ竴涓疄渚嬫潵瑙i噴榪涚▼閫氫俊.涓嬮潰榪欎釜紼嬪簭鏈塻erver鍜宑lient緇勬垚.鍏堣繍琛屾湇鍔$鍚庤繍琛屽鎴風(fēng).
鏈嶅姟绔?server.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MSG_FILE 鈥渟erver.c鈥?
#define BUFFER 255
#define PERM S_IRUSR|S_IWUSR
struct msgtype {
long mtype;
char buffer[BUFFER+1];
};
int main()
{
struct msgtype msg;
key_t key;
int msgid;
if((key=ftok(MSG_FILE,鈥檃'))==-1)
{
fprintf(stderr,鈥滳reat Key Error:%s\a\n鈥?strerror(errno));
exit(1);
}
if((msgid=msgget(key,PERM|IPC_CREAT|IPC_EXCL))==-1)
{
fprintf(stderr,鈥滳reat Message Error:%s\a\n鈥?strerror(errno));
exit(1);
}
while(1)
{
msgrcv(msgid,&msg,sizeof(struct msgtype),1,0);
fprintf(stderr,鈥漇erver Receive:%s\n鈥?msg.buffer);
msg.mtype=2;
msgsnd(msgid,&msg,sizeof(struct msgtype),0);
}
exit(0);
}
鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺?
瀹㈡埛绔?client.c)
#include
#include
#include
#include
#include
#include
#include
#include
#define MSG_FILE 鈥渟erver.c鈥?
#define BUFFER 255
#define PERM S_IRUSR|S_IWUSR
struct msgtype {
long mtype;
char buffer[BUFFER+1];
};
int main(int argc,char **argv)
{
struct msgtype msg;
key_t key;
int msgid;
if(argc!=2)
{
fprintf(stderr,鈥漊sage:%s string\n\a鈥?argv[0]);
exit(1);
}
if((key=ftok(MSG_FILE,鈥檃'))==-1)
{
fprintf(stderr,鈥滳reat Key Error:%s\a\n鈥?strerror(errno));
exit(1);
}
if((msgid=msgget(key,PERM))==-1)
{
fprintf(stderr,鈥滳reat Message Error:%s\a\n鈥?strerror(errno));
exit(1);
}
msg.mtype=1;
strncpy(msg.buffer,argv[1],BUFFER);
msgsnd(msgid,&msg,sizeof(struct msgtype),0);
memset(&msg,鈥橽0鈥?sizeof(struct msgtype));
msgrcv(msgid,&msg,sizeof(struct msgtype),2,0);
fprintf(stderr,鈥滳lient receive:%s\n鈥?msg.buffer);
exit(0);
}
娉ㄦ剰鏈嶅姟绔垱寤虹殑娑堟伅闃熷垪鏈鍚庢病鏈夊垹闄?鎴戜滑瑕佷嬌鐢╥pcrm鍛戒護(hù)鏉ュ垹闄ょ殑.