1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include <iostream> #include <sys/msg.h> #include <sys/ipc.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <cstring>
using namespace std;
template<typename T> void check(const char* er, const T& a, const T& b) { if (a == b) { perror(er); exit(EXIT_FAILURE); } }
struct Msg{ long msg_type; int cnt; };
int main() { int fd=open("name_msg",O_CREAT|O_RDWR,0666); check(string("open").c_str(),fd,-1); key_t k=ftok("name_msg",'A'); check(string("ftok").c_str(),k,-1); int ipcid=msgget(k,IPC_CREAT|0666); check(string("msgget").c_str(),ipcid,-1); Msg cntmsg; cntmsg.msg_type=1; cntmsg.cnt=0; pid_t cpid=fork(); if(cpid==-1){ check(string("fork").c_str(),cpid,-1); }else if(cpid>0){ for(int i=0;i<3;i++){ int r=msgrcv(ipcid,&cntmsg,sizeof(cntmsg),1,0); check(string("msgrcv").c_str(),r,-1); cout<<"parent get cnt="<<cntmsg.cnt<<"\n"; } }else{ for(int i=0;i<3;i++){ cntmsg.cnt++; cout<<"child send cnt="<<cntmsg.cnt<<"\n"; int r=msgsnd(ipcid,&cntmsg,sizeof(cntmsg),0); check(string("msgsnd").c_str(),r,-1); } } return 0; }
|