1、Linux环境实验内容及实验结果请写出具体的实验步骤,并给出相应的实验结果,附上编写的程序及其运行结果截图!实验步骤:1。2. 3. #include #include sys/ipc.hsys/sem.hsys/shm.hstdlib.herrno.hstring.hsignal.h/* The union for semctl may or may not be defined for us.This code,defined in linuxs semctl() manpage,is the proper way to attain it if necessary */#if defin
2、ed (_GNU_LIBRARY_)& !defined (_SEM_SEMUN_UNDEFINED)/* union semun is defined by including */#else/* according to X/OPEN we have to define it ourselves */union semunint val;/* value for SETVAL */struct semid_ds *buf;/* buffer for IPC_STAT,IPC_SET */unsigned short int *array;/* array for GETALL,SETALL
3、 */struct seminfo *_buf;/* buffer for IPC_INFO */;#endif#define SHMDATASIZE1000#define BUFFERSIZE (SHMDATASIZE - sizeof(int)#define SN_READ 0#define SN_WRITE 1#define SN_LOCK 2int Semid = 0;void reader(int shmid);void writer(int shmid);int masterinit(void);char *standardinit(int shmid,int *semid);vo
4、id delete(void);void sigdelete(int signum);void locksem(int semid,int semnum);void unlocksem(int semid,int semnum);void waitzero(int semid,int semnum);void write(int shmid,int semid,char *buffer);int mysemget(key_t key,int nsems,int semflg);int mysemctl(int shmid,int semnum,int cmd,union semun arg);
5、int mysemop(int semid,struct sembuf *sops,unsigned nsops);int myshmget(key_t key,int size,int shmflg);void *myshmat(int shmid,const void *shmaddr,int shmflg);int myshmctl(int shmid,int cmd,struct shmid_ds *buf);int main(int argc,char *argv)char selection3;int shmid;/* 没有参数,则为 master */if(argc 2)shmi
6、d = masterinit();elseshmid = atoi(argv1);printf( do you want a writer(1) or reader(2) ?);fgets(selection,sizeof(selection),stdin);switch(selection0)case 1:writer(shmid); break;2reader(shmid);break;default: invalid choice, quit nreturn 0;void reader(int shmid)int semid;char *buffer;buffer = standardi
7、nit(shmid,&semid);n reader begin to run, and the id of share memory is %d, semaphore id is %d n,shmid,semid);while(1)n wait for writer to input information .fflush(stdout);locksem(semid,SN_WRITE);finish n wait for locking semaphore SN_LOCK .locksem(semid,SN_LOCK);received information: %s n,buffer);u
8、nlocksem(semid,SN_LOCK);unlocksem(semid,SN_READ);void writer(int shmid)writer begin to run,the id of share memory is %d, semaphore id is %dnchar input3;n menu n 1.send a message n 2.quit ninput your choice(1-2):fgets(input,sizeof(input),stdin);switch(input0)write(shmid,semid,buffer);exit(0);char *st
9、andardinit(int shmid,int *semid)void *shmdata;shmdata = myshmat(shmid,0,0);*semid = *(int *)shmdata;buffer = shmdata + sizeof(int);return buffer;int masterinit(void)union semun sunion;int semid,shmid;/* 首先:我们要创建信号量 */semid = mysemget(IPC_PRIVATE,3,SHM_R|SHM_W);Semid = semid;/* 当进程离开时,删除信号量 */atexit(
10、&delete);signal(SIGINT,&sigdelete);/* 信号量 SN_READ 初始化为 1(锁定),SN_WRITE 初始化为 0(未锁定)*/* 信号量 SN_LOCK 初始化为 1(锁定)*/ sunion.val = 1;mysemctl(semid,SN_READ,SETVAL,sunion);mysemctl(semid,SN_LOCK,SETVAL,sunion);sunion.val = 0;mysemctl(semid,SN_WRITE,SETVAL,sunion);/* 现在创建一块共享内存 */shmid = myshmget(IPC_PRIVATE,
11、SHMDATASIZE,IPC_CREAT|SHM_R|SHM_W);/* 将该共享内存映射进进程的虚存空间 */* 将该共享内存标志为已销毁的,这样在使用完毕后,将被自动销毁*/myshmctl(shmid,IPC_RMID,NULL);/* 将信号量的标识符写入共享内存,以通知其它的进程 */*(int *)shmdata = semid;* begin to run, and semaphore id is %d n,shmid);return shmid;void delete(void)n quit; delete the semaphore %d n,Semid);union se
12、mun senion;senion.val=0;if(mysemctl(Semid,0,IPC_RMID,senion) = -1)Error releasing semaphore. nvoid sigdelete(int signum)/* Calling exit will conveniently trigger the normal delete item. */void locksem(int semid,int semnum)struct sembuf sb;sb.sem_num = semnum;sb.sem_op = -1;sb.sem_flg = SEM_UNDO;myse
13、mop(semid,&sb,1);void unlocksem(int semid,int semnum)sb.sem_op = 1;void waitzero(int semid,int semnum)sb.sem_op = 0;sb.sem_flg = 0;/* No modification so no need to undo */void write(int shmid,int semid,char *buffer)n wait for reader to read in information .locksem(semid,SN_READ);finish; wait for loc
14、king semaphore SN_LOCK.nplease input information:fgets(buffer,BUFFERSIZE,stdin);unlocksem(semid,SN_WRITE);int mysemget(key_t key,int nsems,int semflg)int retval;retval = semget(key,nsems,semflg);if(retval = -1)semget key %d,nsems %d failed: %s ,key,nsems,strerror(errno);exit(255);return retval;int m
15、ysemctl(int semid,int semnum,int cmd,union semun arg)retval = semctl(semid,semnum,cmd,arg);semctl semid %d,semnum %d,cmd %d failed: %s,semid,semnum,cmd,strerror(errno); return retval;int mysemop(int semid,struct sembuf *sops,unsigned nsops)retval = semop(semid,sops,nsops);semop semid %d (%d operatio
16、ns) failed:,semid,nsops,strerror(errno);int myshmget(key_t key,int size,int shmflg)retval = shmget(key,size,shmflg);shmget key %d,size %d failed:,key,size,strerror(errno);void *myshmat(int shmid,const void *shmaddr,int shmflg)void *retval;retval = shmat(shmid,shmaddr,shmflg);if(retval = (void*) -1)shmat shmid %d failed:,shmid,strerror(errno);int myshmctl(int shmid,int cmd,struct shmid_ds *buf)retval = shmctl(shmid,cmd,buf);shmctl shmid %d,cmd %d failed:,shmid,cmd,strerror(errno);实验心得教师评阅意见教师签字签字日期年 月 日