开业于2004年,诚信服务几万客户
翔意数码淘宝店:xynbnb.taobao.com
全国客服电话:010-59000667
地址:北京东城区东兴隆街56号北京商界A座512
ThinkPad产品专业客服 苹果产品专业客服
查看: 4747|回复: 40

救命~~~~~~

  [复制链接]
发表于 2011-6-20 11:21 | 显示全部楼层 |阅读模式
OS编程作业1.doc (12.5 KB, 下载次数: 148)



作业题目:进程间通信练习
内容:
编写两个程序mysem.c(编译后为mysem)和myinput.c(编译后为myinput),实现两个程序(进程)之间的通信。要求如下:
mysem创建一个共享内存myshm(共享内存ID,内存大小为512字节),供mysem和myinput共享
mysem创建一个子进程,该子进程加载myinput
myinput从键盘以追加方式向myshm中输入信息(字符型),mysem接收信息并显示在屏幕上
当myinput从键盘输入“end”并存入myshm后,myinput结束(退出),mysem收到“end”显示后,也退出,并释放所有的资源。

解释:
参考课本例14.4   14.5以及第7次小课实验
目的:深入了解“共享内存”、子进程加载、信号量、进程间的同步与互斥等操作系统核心内容,以及它们的使用
说明:
本次作业满分为10分,将直接计入成绩,要求各位同学认真按照要求完成。
如发现抄袭者(代码、说明文字有60%雷同者),双方或者多方均按0分计算
交作业要求:
打印作业题目和要求
要求分析题意、对代码做相关说明文档(手写)、给出实验结果图
发表于 2011-6-20 11:52 | 显示全部楼层
helpless~~
发表于 2011-6-20 14:12 | 显示全部楼层
找mini ,他会做。。。
发表于 2011-6-20 14:14 | 显示全部楼层
linux不会~~
发表于 2011-6-20 14:15 | 显示全部楼层
而且还是c。。。
 楼主| 发表于 2011-6-20 16:08 | 显示全部楼层
#include<stdio.h>
#include<linux/shm.h>
#include<string.h>
#include<stdlib.h>
#include<linux/sem.h>
#define MAXSIZ 512       //定义共享内存大小为512b
//以下为定义信号量
int emptyid;
int fullid;
int main()            //主函数

{
//以下为定义信号量之数据结构
struct sembuf p,z;
union semun arg;
//定义共享内存之ID;
int shm;
char *shareddr;
char buffer[BUFSIZ];
//以下为创建内存&&初始化
shm=shmget(123,MAXSIZ,0666|IPC_CREAT);
shareddr=(char*)shmat(shm,0,0);
//以下为创建信号量
emptyid=semget(1234,1,IPC_CREAT|0666);
fullid=semget(1235,1,IPC_CREAT|0666);
//以下为初始化信号量
arg.val=1;            //初始互斥信号量=1时,允许一个进程进入
if(semctl(emptyid,0,SETVAL,arg==-1))
perror("semctl setval error");
arg.val=0;        //初始化缓冲区中没有数据
if(smctl(fullid,0,SETVAL,arg)==-1)
perror("semctl setval error");
//以下为对P和V的初始化操作
P.sem_num=0;
P.sem_op=-1;
p.sem_flg=SEM_UNDO;
V.sem_num=0;
V.sem_op=1;
V.sem_flg=SEM_UNDO;
//以下为通过while循环输入Message
while(1)
{
semop(emptyid,&P,1);
Puts("input some message:");
fgets(buffer,BUFSIZ,stdin);
strcat(shareddr,buffer);
semop(fullid,&V,1);
if(strncmp(buffer,"end",3)==0)
break;
}
exit(0);




#include<stdio.h>
#include<linux/shm.h>
#include<string.h>
#include<stdlib.h>
#include<linux/sem.h>
#define MAXSIZ 512       //定义共享内存大小为512b
//以下为定义信号量
int emptyid;
int fullid;
int main()            //主函数

{
//以下为定义信号量之数据结构
struct sembuf p,z;
union semun arg;
//定义共享内存之ID;
int shm;
char *shareddr;
char buffer[BUFSIZ];
//以下为创建内存&&初始化
shm=shmget(123,MAXSIZ,0666|IPC_CREAT);
shareddr=(char*)shmat(shm,0,0);
//以下为创建信号量
emptyid=semget(1234,1,IPC_CREAT|0666);
fullid=semget(1235,1,IPC_CREAT|0666);
//以下为初始化信号量
arg.val=1;            //初始互斥信号量=1时,允许一个进程进入
if(semctl(emptyid,0,SETVAL,arg==-1))
perror("semctl setval error");
arg.val=0;        //初始化缓冲区中没有数据
if(smctl(fullid,0,SETVAL,arg)==-1)
perror("semctl setval error");
//以下为对P和V的初始化操作
P.sem_num=0;
P.sem_op=-1;
p.sem_flg=SEM_UNDO;
V.sem_num=0;
V.sem_op=1;
V.sem_flg=SEM_UNDO;
//以下为通过while循环输入Message
while(1)
{
semop(emptyid,&P,1);
Puts("input some message:");
fgets(buffer,BUFSIZ,stdin);
strcat(shareddr,buffer);
semop(fullid,&V,1);
if(strncmp(buffer,"end",3)==0)
break;
}
exit(0);



哪里错了???


发表于 2011-6-20 16:11 | 显示全部楼层
看来都在为作业发愁啊!
作业:
10月份以前以网络安全升级为目的消耗科研经费100万元,最好控制在100万至115万之间。备注:不准买车。
头痛啊
 楼主| 发表于 2011-6-20 16:31 | 显示全部楼层
虛擬機沒裝共享。。。。

繼續試試。。。。


#define BUFSIZ  512
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<linux/shm.h>
#include<linux/sem.h>


int empty;
int full;

main(){  

      
      int myshm;
      char *viraddr;
      char buffer[BUFSIZ];      

      struct sembuf P,V;
      union semun arg;
      empty=semget(1366,1,IPC_CREAT|0666);
      full=semget(1155,1,IPC_CREAT|0666);
      myshm=shmget(775,BUFSIZ,0666|IPC_CREAT);  //
      viraddr=(char*)shmat(myshm,0,0);



      arg.val=1;
      if(semctl(empty,0,SETVAL,arg)==-1)
      perror("semctl setval error");
      arg.val=0;
      if(semctl(full,0,SETVAL,arg)==-1)
      perror("semctl setval error");
      P.sem_num = 0;
      P.sem_op =-1;
      P.sem_flg = SEM_UNDO;
      V.sem_num = 0;
      V.sem_op = 1;
      V.sem_flg = SEM_UNDO;      
      

      while(1){
              semop(empty,&P,1);
              puts("Put some text:");
              fgets(buffer,BUFSIZ,stdin);
              strcat(viraddr,buffer);
              semop(full,&V,1);
              if(strncmp(buffer,"end",3)==0)
              break;     
      }
       shmdt(viraddr);
       exit(0);                     
}

Mysem.c
#define BUFSIZ  512
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<linux/shm.h>
#include<linux/sem.h>

int empty;
int full;

main(){
      int myshm,P1;
      char *viraddr;   
      char buffer[BUFSIZ];
      
      struct sembuf P,V;
      union semun arg;
      empty=semget(1366,1,IPC_CREAT|0666);
      full=semget(1155,1,IPC_CREAT|0666);
      myshm=shmget(775,BUFSIZ,0666|IPC_CREAT);//
      viraddr=(char*)shmat(myshm,0,0);


      arg.val=1;
      if(semctl(empty,0,SETVAL,arg)==-1)
      perror("semctl setval error");
      arg.val=0;
      if(semctl(full,0,SETVAL,arg)==-1)
      perror("semctl setval error");
      P.sem_num = 0;
      P.sem_op =-1;
      P.sem_flg = SEM_UNDO;
      V.sem_num = 0;
      V.sem_op = 1;
      V.sem_flg = SEM_UNDO;   

      while((P1=fork())== -1);
      if(P1 == 0){
                         execl("./myinput",0,NULL);
      }
      else{
                 while(1){
                          semop(full,&P,1);
                          printf("Your message is :\n%s",viraddr);
                          semop(empty,&V,1);
                          if(strstr(viraddr,"end"))
                          break;
                          
                 }
           }
       wait(0);
       shmdt(viraddr);
       shmctl(myshm,IPC_RMID,0);
       semctl(empty,IPC_RMID,0);
       semctl(full,IPC_RMID,0);
       printf("Parent exit!\n");
       exit(0);
发表于 2011-6-20 16:39 | 显示全部楼层
太nb了~~
发表于 2011-6-20 16:41 | 显示全部楼层
被X光照过不行的话
可以去福岛试试
 楼主| 发表于 2011-6-20 16:55 | 显示全部楼层
算了。。。。还是编译不出来。。。直接把我的名字ps上去算了。。。。
发表于 2011-6-20 16:58 | 显示全部楼层
dokken 发表于 2011-6-20 16:41
被X光照过不行的话
可以去福岛试试

呵呵,现在日国的消息少了呢
发表于 2011-6-20 17:17 | 显示全部楼层
这个我不懂~~~~~~~
发表于 2011-6-20 17:20 | 显示全部楼层
我纯谁~~~~~~~
发表于 2011-6-20 18:13 | 显示全部楼层
你真纯~~~
发表于 2011-6-20 18:47 | 显示全部楼层
不懂,只能顶你了
发表于 2011-6-20 19:06 | 显示全部楼层
我看着都想吐了……
发表于 2011-6-20 19:49 | 显示全部楼层
吐把,嘿嘿,几个月了?
 楼主| 发表于 2011-6-20 20:23 | 显示全部楼层
回复 九月彩虹 的帖子

是不是錯的太多了。。。
发表于 2011-6-20 21:09 | 显示全部楼层
看到看不懂。。
发表于 2011-6-20 21:11 | 显示全部楼层
C,帮不了你,Java还行
发表于 2011-6-21 06:48 | 显示全部楼层
是不懂c语言 学的时候就想吐
发表于 2011-6-21 07:29 | 显示全部楼层
都是人才
发表于 2011-6-21 09:29 | 显示全部楼层
太高科技了
发表于 2011-6-21 09:31 | 显示全部楼层
高科技人才~~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

返回顶部