第四课 习题之我解

 

 1.实现两个进程通过消息队列实现进程通信

    //写入进程 #include #include #include #include #include #include #include #define BUFSZ 512 struct message{ long msg_type; char msg_text[BUFSZ]; }; int main() { int qid; key_t key; int len; struct message msg; if((key=ftok(".",'a'))==-1){ perror("ftok"); exit(1); } if((qid=msgget(key,IPC_CREAT|0666))==-1){ perror("msgget"); exit(1); } printf("opened queue %d/n",qid); puts("Please enter the message to queue:"); while((fgets((&msg)->msg_text,BUFSZ,stdin))!=NULL) { msg.msg_type = getpid(); len = strlen(msg.msg_text); msg.msg_text[len-1]='/0'; if((msgsnd(qid,&msg,len,0))<0){ perror("message posted"); exit(1); } } exit(0); }

 

    //读出进程 #include #include #include #include #include #include #include #define BUFSZ 512 struct message{ long msg_type; char msg_text[BUFSZ]; }; int main() { int qid; key_t key; int len; struct message msg; if((key=ftok(".",'a'))==-1){ perror("ftok"); exit(1); } if((qid=msgget(key,IPC_CREAT|0666))==-1){ perror("msgget"); exit(1); } printf("opened queue %d/n",qid); while(msgrcv(qid,&msg,BUFSZ,0,0)>=0){ printf("message is:%s/n",(&msg)->msg_text); } exit(0); }

 

2. 实现两个进程利用共享内存实现进程通信

    这里的内存实现通信其实和上面的差不多,只不过是队列改成了内存

    这里有个书本的例子,可以作为参考...只不过是一个进程,我们只需要分成两个部分的代码,分别执行写入和读出就能实现题目要求

    #include #include #include #include #include #include #define BUFSZ 2048 int main() { int shmid,i,fd,nwrite,nread; char *shmadd,*tp; char buf[5]="Hello"; //暂存 if((shmid=shmget(IPC_PRIVATE,BUFSZ,0666))<0){ perror("shmget"); exit(1); } else printf("created shared-memory: %d/n",shmid); if((shmadd=shmat(shmid,0,0))<(char *)0){ perror("shmat"); exit(1); } else printf("attached shared-memory/n"); tp = shmadd; //获得贡献内存首地址指针 for (i = 0; buf[i] != '/0'; i++,tp++) { *tp = buf[i]; //暂存内容复制 buf[i] = '/0'; //暂存清空 } *(tp-1) = '/0'; //到这里相当于实现了向共享内存中传递要通信的信息 //shmadd="Hello"; //指针指向了新内存地址不能这样传递 // 下面是 打开文件,我们可以不管直接跳到后面 if((fd = open("share",O_CREAT | O_RDWR,0666))<0){ perror("open"); exit(1); } else printf("open success!/n"); //共享内存信息写入文件,这里我们可以直接改成在另个进程中写标准输出端,和上面那些则在不同的进程中执行,这样就能实现内存共享了.... // 相当于就是读共享内存信息 if((nwrite=write(fd,shmadd,5))<0){ perror("write"); exit(1); } else printf("write success!/n"); //文件指针重置,这里我们也不用管 lseek( fd, 0, SEEK_SET ); if((nread=read(fd,buf,5))<0){ perror("read"); exit(1); } else printf("read %d form file:%s/n",nread,buf); close(fd); //直接到这里 对于共享内存的善后处理.. if((shmdt(shmadd))<0){ perror("shmdt"); exit(1); } else printf("deleted shared-memory/n"); exit(0); }

你可能感兴趣的:(Linux,学习专题)