操作系统上机报告
操作系统上机实验报告

操作系统上机实验报告实验一进程的建立1.实验目的学会通过基本的Windows进程控制函数,由父进程创建子进程,并实现父子进程协同工作。
2.实验软硬件环境Dev-C++3.实验内容创建两个进程,让子进程读取一个文件,父进程等待子进程读取完文件后继续执行,实现进程协同工作。
进程协同工作就是协调好两个进程,使之安排好先后次序并以此执行,可以用等待函数来实现这一点。
当需要等待子进程运行结束时,可在父进程中调用等待函数。
4.实验程序及分析实验程序源代码如下:父进程:#include<stdio.h>#include<windows.h>int main(){STARTUPINFO si;PROCESS_INFORMA TION pi; //当Windows创建新进程时,将使用这两个结构体的有关成员。
所以在创建子进程之前应该对结构体进行声明和初始化。
ZeroMemory(&pi,sizeof(pi));ZeroMemory(&si,sizeof(si));si.cb=sizeof(STARTUPINFO);if(CreateProcess("lab1.2.exe",NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL ,NULL,&si,&pi))//创建一个新进程,若是成功,就返回1,进而实现if选择{printf("子进程已创建~\n");int i,sum=0;for(i=1;i<=100;++i){sum+=i;printf("sum=%d\n",sum);} //进行1+2+3+….+100计算WaitForSingleObject(pi.hProcess,INFINITE); FILE *fp;fp=fopen("date.txt","r");char ch=fgetc(fp); //创建文件并打开while(ch!=EOF){putchar(ch);ch=fgetc(fp);}fclose(fp); //关闭文件}elseprintf("子进程创建失败~\n");return 0;}子进程:#include<stdio.h>#include<stdlib.h>int main(){printf("子进程运行~\n");FILE *fp;if(fp=fopen("date.txt","w")){printf("已经创建文件!\n");int i;for(i=48;i<58;i++) fputc(i,fp);fputc('\n',fp);fclose(fp);printf("已经写入数据:"); //向文本中写入数据fp=fopen("date.txt","r");char ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp); //输出数据}fclose(fp);}else printf("创建文件失败!\n");system("pause");return 0;}5. 实验截图说明及分析6. 实验心得体会掌握了父进程创建子进程的方法,对操作系统多线程认识更深了。
操作系统课程_上机报告

操作系统课程设计实验报告册目录实验说明本课程由操作系统实验和操作系统课程设计专题两部分组成,共计56学时,分7次实施,每次8学时。
本课程使用Linux系统为实验平台,推荐使用ubuntu 10.04/内核版本2.6.32-28/源码版本2.6.32-60;重要提示实验1 Linux(虚拟机)安装及Linux常用命令使用实验2 makefile的编写及Linux内核编译实验3 Linux的进程和线程实验4 同步与互斥实验5 文件系统实验说明1.实验做为学习的重要促进手段,是为了深化对理论的理解,锻炼实践动手能力。
2.实验同时也作为考核的手段。
3.实验内容会在课程进行中下达,并且会分次地、部分地被抽查。
4.课程结束时,要求把所有的实验整理成一个完整的电子文档并上交,做为最后成绩的评定依据。
5.如果有兴趣的合适的题目,也可自己选题目。
格式说明1.本文档文件名命名为“学号-姓名”,如“13071000_小王”。
2.留白部分不足的自己调整长度,也可加页(增加内容应在表格内)。
3.每次的实验报告都要在这个文件中(按照实验次序依次)增加,而不是每次一个新的word文件。
4.本文档保存为doc格式(请勿用Word2007的docx格式)。
重要提示:1.实验正文建议使用小四号或五号宋体。
2.若附加图形,则请直接嵌入到实验手册相应位置。
3.各实验的源程序,请按实验分目录存放,如第一个实验的源程序存放在目录lab1下,第二个实验的源程序存放在目录lab2下等等,依次类推。
4.可互相讨论,但严禁抄袭网络或同学的实验结果。
更改设置:。
操作系统上机实习报告

文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构; 即在磁盘上组织文件的方法。也指用于存储文件的磁盘或分区,或文件系 统种类。因此,可以说"我有 2 个文件系统"意思是他有 2 个分区,一个存文 件,或他用 "扩展文件系统",意思是文件系统的种类。 通过本次的课程设计,使我对文件系统有了更加深刻的了解,能够正确运用 操作系统课程中所学的基本理论和知识, 加深了对多用户文件系统以及二级目录 的磁盘文件系统的文件操作, 让自己对 C++的应用多了一份了解, 算是自己用 C++
3
char ch; char jian; printf("\t\t\t\t李策----文件管理系统.0\n\t\t\t\t\n"); //打开主文件 fpm=fopen("C:\\MasterFile.txt","rb"); 目录信息文件 if(fpm==NULL) { printf("\n提示:主文件目录信息文件还不存在,是否创 建?(y/n)\n"); scanf("%s",& struct MasterFile {
5
char username[20]; //用户名 char password[20]; //用户名密码 char flag; //标志 MasterFile *next; // }; //用户文件结构体 struct UserFile { int fnum; char fname[20]; int flength; char flag; char fpw[20]; UserFile *link; };
n=='y'||jian=='Y') fpm=fopen("C:\\MasterFile.txt","wb"); //创建主文件目 录的文件 else exit(0); } fpu=fopen("C:\\UserFile.txt","rb"); //打开用户文件目录信息文件 if(fpu==NULL) { printf("\n提示:用户文件目录信息文件还不存在,是否创 建?(y/n)\n"); scanf("%s",&jian); if(jian=='y'||jian=='Y') fpu=fopen("C:\\UserFile.txt","wb"); //创建用户文件目 录的文件 else exit(0); } printf("文件正在打开,请稍等..."); for(int i=0;i<20;i++) //读取主 文件目录信息 fread(&MFD[i],sizeof(struct MasterFile),1,fpm); //将文 件的内容放入接点中 fclose(fpm); // 关闭文件 while(!feof(fpu)) { //读取用户目录文件信息 for(int i=0;i<20;i++) { if(fread(&UFD[i][0],sizeof(struct UserFile),20,fpu)) //将文件的内容放入接点中 MFD[i].next=(struct MasterFile*)&UFD[i][0]; } } //关闭文件 fclose(fpu);
操作系统上机实验报告

操作系统上机实验报告篇一:操作系统上机实验报告(13版)编者说明《操作系统》是计算机科学与技术专业的一门核心专业基础课。
学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。
这些原理与技巧可以说是计算机界的前辈们一代接一代不停歇的努力所留下的知识与智慧的结晶,学习和掌握它们对于激发自己的创造力和想象力是很有帮助的。
如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法就是在实践中练习,通过自己模拟设计操作系统的原理实验,可以培养程序设计的方法和技巧,提高编制和理解清晰、合理、可读性好的系统程序的能力,加深对操作系统课程的理解。
使自身更好的掌握操作系统的基本概念、基本原理及基本功能,从而具有分析实际操作系统的基本能力,深入直观的理解操作系统使用的各类算法。
《操作系统实验指导书》是针对这门课的实验编写的,书中设计了三个操作系统原理实验。
三个实验难易层次分明,重点突出,其中实验一(Windows操作系统)和实验二(进程管理)为验证性实验,重在验证教材中的理论原理,而实验三(虚拟存储管理)为设计性实验,重在培养理论原理应用于实践的设计能力。
所有实验共8学时,采用C语言作为编程语言模拟设计完成相关程序。
限于编者的水平,难免有疏(本文来自: 千叶帆文摘:操作系统上机实验报告)漏与错误,敬请读者批评指正。
编者:李可实验一Windows操作系统一、实验题目计算机管理、任务管理、察看了解注册表二、实验目的Windows是目前使用人数最多的操作系统,学习操作系统,对操作系统有更加深入的了解。
三、实验内容1. Windows提供了那些人机交互的界面?2. 观察Windows对应用程序运行的支持。
Windows提供了几种方式启动应用程序?Windows提供了几种方式让用户改变应用程序外观?Windows提供了几种方式结束程序的运行?3. 了解windows对应用程序的运行时对I/O支持。
操作系统上机实验报告

操作系统课程设计实验报告册班级: 130812学号: ********姓名:**目录实验1 Linux系统调用 (2)实验2 实现spinlock以及共享内存调用 (5)实验3 内核模块 (14)实验4 设备驱动 (18)实验5 文件系统 (22)实验编号 1 题目Linux系统调用实验目的加深对系统函数库、操作系统提供的系统调用的共同点和差异的认识,通过认识、了解Linux系统调用的实现方式,强化操作系统为用户提供接口方式的理性认识。
实验内容为Linux内核增加一个系统调用,并编写用户进程的程序来测试。
要求该系统调用能够完成以下功能:1. 该系统调用有1个整型参数。
2. 若参数大于0,则返回自己学号的最后一位。
如学号为248,则返回8。
3. 若参数小于或等于0,则返回自己的学号。
如学号为248,则返回248。
报告内容要求(1) 程序实现方法和思路(2) 测试及结果报告正文一、实验准备联网下载版本为2.6.25.14的linux内核压缩包,使用U盘放入WMware 中安装的Fedora9操作系统中。
解压后文件夹:/usr/src/linux-2..6.25.14。
二、实验步骤(一)、修改内核文件(1)修改内核文件:/usr/src/linux-2..6.25.14/kernel/sys.c 在sys.C文件中添加新的系统调用实现,如下所示:asmlinkage int sys_mycall(int a){if(a>0)return 5;elsereturn 13081175;}截图:(2)在system call table中增加新的系统调用表项,寻找文件/usr/src/linux-2..6.25.14/arch/x86/kernel/syscall_table_32.h,在最后一行添加:.long sys_mycall /*327*/截图:(3)增加新的系统调用编号:修改文件/usr/src/linux-2..6.25.14/include/asm-x86/unistd_32.h 的最后一行,增加:#define __NR_mycall 327 /*my new syscall*/数字紧跟上一行最后一个系统调用的编号。
计算机操作系统上机实验报告

计算机操作系统(cāo zuò xì tǒnɡ)上机实验报告
云南师范大学信息(xìnxī)学院
实验报告
学号:134100010姓名:姜兴玲班级:计科13A 课程名称:操作系统实验名称:存储管理
实验性质:①综合性实验②设计性实验③验证性实验试验时间:2015年5月5日试验地点:睿智4栋212
本试验所用的设备:计算机一台
实验目的
了解计算机的存储并学会管理。
实验内容及过程:
1.右键单击工具栏,打开任务管理器查看性能来了解CPU
使用和页面文件使用。
2、单击开始设置控制面板系统
单击高级然后选择性能的设置来设置系统、管理系统
3、性能和维护打开控制面板切换到分类视图,选择性能和维护来进行操作。
小结:
通过对控制面板的熟悉我们能更好的了解计算机并且能对存储管理更好的了解和学习!
任课教师评语
教师签字: 年月日
注:每学期至少一次设计性实验。
每学期结束请任课教师按时按量统一(tǒngyī)交到教学秘书处
内容总结
(1)计算机操作系统上机实验报告。
操作系统上机实验报告

操作系统上机实验报告学院:计算机科学与技术学院专业:计算机科学与技术学号:姓名:读者-写者的读写限制(包括读者优先和写者优先)1)写-写互斥,即不能有两个写者同时进行写操作2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写3)读读允许,即可以有2个以上的读者同时读读者优先的限制:如果一个读者申请读操作时,已经有一个读者在读,则该读者可以直接读写者优先的限制:如果一个读者申请读操作时,有写者在等待访问共享资源时,则该读者要等到没有写者处于等的状态时才能开始读操作代码部分:#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/shm.h>#include <signal.h>#include <unistd.h>#include <stdarg.h>#include <assert.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <time.h>/*** @struct SHM_ACCESS* @brief 读者写者访问控制结构*/typedef struct _SHM_ACCESS {int reader_count; /**< 读者计数器 */int reader_mutex; /**< 读者互斥量 */int writer_mutex; /**< 写者互斥量 */} SHM_ACCESS;typedef struct _READER_WRITER_SHM {SHM_ACCESS shm_access;int shm_reader;int shm_writer;} READER_WRITER_SHM;static sig_atomic_t term_flag = 0;intlogv(const char *fmt, ...){int n;struct timeval tv;struct tm lt;char buf[14];va_list ap;gettimeofday(&tv, 0);lt = *localtime(&_sec);strftime(buf, sizeof(buf), "%H:%M:%S.", <);snprintf(buf + 9, sizeof(buf) - 9, "%03d", (int)(_usec / 1000)); n = printf("%s ", buf);va_start(ap, fmt);n += vprintf(fmt, ap);va_end(ap);return n;}/** System V IPC 函数的简化接口*/intsem_p(int semid){int rc;struct sembuf buf;buf.sem_num = 0;buf.sem_op = -1;buf.sem_flg = SEM_UNDO;for (;;) {rc = semop(semid, &buf, 1); if (0 == rc)break;if (rc < 0) {if (EINTR == errno)continue;else {assert(0);}}}}intsem_v(int semid){int rc;struct sembuf buf;buf.sem_num = 0;buf.sem_op = +1;buf.sem_flg = SEM_UNDO;for (;;) {rc = semop(semid, &buf, 1); if (0 == rc)break;if (rc < 0) {if (EINTR == errno)continue;else {assert(0);}}}return rc;}intsem_get(const char *path, int id){int semid;key_t semkey;int rc;union semun {int val;struct semid_ds *buf;unsigned short *array;} arg;semkey = ftok(path, id);if ((key_t)-1 == semkey) {return (-1);}semid = semget(semkey, 1, IPC_CREAT | SEM_R | SEM_A); if (semid < 0)return semid;arg.val = 1;rc = semctl(semid, 0, SETVAL, arg);assert(0 == rc);return semid;}intsem_del(const char *path, int id){int semid;key_t semkey;int rc;semkey = ftok(path, id);if ((key_t)-1 == semkey) {return (-1);}semid = semget(semkey, 1, SEM_R | SEM_A);return sem_rmid(semid);}intsem_rmid(int semid){int rc;rc = semctl(semid, 0, IPC_RMID);return rc;}intshm_get(const char *path, int id, size_t size){int shmid;key_t semkey;semkey = ftok(path, id);if ((key_t)-1 == semkey) {return (-1);}shmid = shmget(semkey, size, IPC_CREAT | SHM_R | SHM_W); if (shmid < 0)return shmid;return shmid;}/** 共享内存读写控制函数*/intLockShmForWrite(SHM_ACCESS *p_access){sem_p(p_access->writer_mutex);return (0);}intUnLockShmForWrite(SHM_ACCESS *p_access){sem_v(p_access->writer_mutex);return (0);}intLockShmForRead(SHM_ACCESS *p_access){sem_p(p_access->reader_mutex);p_access->reader_count++;logv("reader_count = %d\n", p_access->reader_count); if (1 == p_access->reader_count) {/* 第一个读进程 */sem_p(p_access->writer_mutex);}sem_v(p_access->reader_mutex);return (0);}intUnLockShmForRead(SHM_ACCESS *p_access){sem_p(p_access->reader_mutex);p_access->reader_count--;logv("reader_count = %d\n", p_access->reader_count); if (0 == p_access->reader_count) {/* 最后一个读进程 */sem_v(p_access->writer_mutex);}sem_v(p_access->reader_mutex);return (0);}void*shm_at(int shmid){return shmat(shmid, NULL, 0);}intshm_dt(const void *shmaddr){return shmdt(shmaddr);}intshm_rmid(int shmid){return shmctl(shmid, IPC_RMID, NULL);}void(*Signal(int sig, void (*func)(int)))(int){struct sigaction act, oact;act.sa_handler = func;sigemptyset(&act.sa_mask);act.sa_flags = 0;#ifdef SA_INTERRUPTact.sa_flags |= SA_INTERRUPT;#endifif (sigaction(sig, &act, &oact) < 0)return(SIG_ERR);return(oact.sa_handler);}#define KEY_FILE "KEY_FILE"intstarter(void){int shmid;int semid;READER_WRITER_SHM *ptr;shmid = shm_get(KEY_FILE, 1, sizeof(READER_WRITER_SHM)); ptr = (READER_WRITER_SHM *)shm_at(shmid);semid = sem_get(KEY_FILE, 2);ptr->shm_access.reader_mutex = semid;ptr->shm_access.reader_count = 0;semid = sem_get(KEY_FILE, 3);ptr->shm_access.writer_mutex = semid;return 0;}intcleaner(void){int shmid;int semid;READER_WRITER_SHM *ptr;sem_del(KEY_FILE, 3);sem_del(KEY_FILE, 2);shmid = shm_get(KEY_FILE, 1, sizeof(READER_WRITER_SHM)); shm_rmid(shmid);return 0;}voidsig_term(int sig){term_flag++;}voidsig_intr(int sig){}intreader(void){int shmid;pid_t pid;READER_WRITER_SHM *ptr;shmid = shm_get(KEY_FILE, 1, sizeof(READER_WRITER_SHM)); ptr = (READER_WRITER_SHM *)shm_at(shmid);pid = getpid();srand(time(0) + pid);while (!term_flag) {sleep(rand() % 20);logv("reader-%10d come\n", (int)pid);LockShmForRead(&ptr->shm_access);logv("reader-%10d read begin\n", (int)pid);sleep(rand() % 10);logv("reader-%10d read end\n", (int)pid);UnLockShmForRead(&ptr->shm_access);}return 0;}intwriter(void){int shmid;pid_t pid;READER_WRITER_SHM *ptr;shmid = shm_get(KEY_FILE, 1, sizeof(READER_WRITER_SHM)); ptr = (READER_WRITER_SHM *)shm_at(shmid);pid = getpid();srand(time(0) + pid);while (!term_flag) {sleep(rand() % 20);logv("writer-%10d come\n", (int)pid);LockShmForWrite(&ptr->shm_access);logv("writer-%10d write begin\n", (int)pid);sleep(rand() % 10);logv("writer-%10d write end\n", (int)pid);UnLockShmForWrite(&ptr->shm_access);}return 0;}#define M 8#define N 2intmain(int argc, char *argv[]) {int i, m, n;pid_t pid[M + N];m = M, n = N;Signal(SIGTERM, &sig_term);starter();for (i = 0; i < m; i++) { pid[i] = fork();if (pid[i] == 0) {reader();exit(0);} else {continue;}}for (i = 0; i < n; i++) { pid[i + m] = fork();if (pid[i + m] == 0) { writer();exit(0);} else {continue;}}Signal(SIGINT, &sig_intr);pause();for (i = 0; i < M + N; i++) kill(pid[i], SIGTERM);for (i = 0; i < M + N; i++)waitpid(pid[i], NULL, 0);cleaner();return 0;}。
操作系统上机实验报告(13版)

编者说明《操作系统》是计算机科学与技术专业的一门核心专业基础课。
学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。
这些原理与技巧可以说是计算机界的前辈们一代接一代不停歇的努力所留下的知识与智慧的结晶,学习和掌握它们对于激发自己的创造力和想象力是很有帮助的。
如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法就是在实践中练习,通过自己模拟设计操作系统的原理实验,可以培养程序设计的方法和技巧,提高编制和理解清晰、合理、可读性好的系统程序的能力,加深对操作系统课程的理解。
使自身更好的掌握操作系统的基本概念、基本原理及基本功能,从而具有分析实际操作系统的基本能力,深入直观的理解操作系统使用的各类算法。
《操作系统实验指导书》是针对这门课的实验编写的,书中设计了三个操作系统原理实验。
三个实验难易层次分明,重点突出,其中实验一(Windows操作系统)和实验二(进程管理)为验证性实验,重在验证教材中的理论原理,而实验三(虚拟存储管理)为设计性实验,重在培养理论原理应用于实践的设计能力。
所有实验共8学时,采用C语言作为编程语言模拟设计完成相关程序。
限于编者的水平,难免有疏漏与错误,敬请读者批评指正。
编者:李可实验一Windows操作系统一、实验题目计算机管理、任务管理、察看了解注册表二、实验目的Windows是目前使用人数最多的操作系统,学习操作系统,对操作系统有更加深入的了解。
三、实验内容1.Windows提供了那些人机交互的界面?2.观察Windows对应用程序运行的支持。
●Windows提供了几种方式启动应用程序?●Windows提供了几种方式让用户改变应用程序外观?●Windows提供了几种方式结束程序的运行?3.了解windows对应用程序的运行时对I/O支持。
系统中有多少个I/O设备?多少种I/O控制方式?能否确信应用程序I/O需要操作系统支持?能体会到“设备独立性”吗?4.观察资源管理器,记录你使用的机器的资源情况:CPU、内存、磁盘分区及容量、文件目录树及文件属性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统上机报告实验一、匿名管道通信一、实验目的学会创建匿名管道,并且能够利用管道进行进程间的通信。
二、实验内容分别建立名为Parent的单文档应用程序和Child的单文档应用程序作为父子进程,由父进程创建一个匿名管道,实现父子进程向匿名管道写入和读取数据。
三、设计与实现过程本实验在VC6.0上实现▪ A.父进程▪先建一个Parent的单文档应用程序,增加“创建管道”“读取数据”“写入数据”三个菜单,并添加消息响应函数OnPipeCreate(),OnPipeRead(),OnPipeWrite()。
在CParentView类中增加成员变量HANDLE类型的hRead,hWrite,初始化变量,并在析构函数中释放句柄:▪void CParentView::OnPipeWrite()▪{▪if(!CreatePipe(…)) /*创建匿名管道*/▪{▪ /*显示消息“创建管道失败!”*/▪ /*退出*/▪}▪if(!CreateProcess(…)) /*创建子进程*/▪{▪ /*关闭句柄hRead、hWrite*/▪ /*显示消息“创建子进程失败!”*/▪ /*退出*/▪}▪}▪void CParentView::OnPipeRead()▪{▪ /*定义一个字符数组,用于存放读取的数据*/▪if(!ReadFile(…)) /*读取数据*/▪{▪ /*显示消息“读取数据失败!”*/▪ /*退出*/▪}▪/*打印读取的数据*/▪/*退出*/▪void CParentView::OnPipeWrite()▪{▪/*定义一个字符数组,用于存放写入的数据*/▪if(!WriteFile(…)) /*写入数据*/▪ /*显示消息“写入数据失败!”*/▪ /*退出*/▪}▪}▪ B.子进程▪建一个Child的单文档,在CChildView中增加两个成员HANDLE 型的成员变量hRead,hWrite,并添加消息响应函数OnPipeRead(),OnPipeWrite(),再添加虚函数OnInitialUpdate(),并在析构函数中释放句柄。
▪void CChildView::OnInitialUpdate()▪{▪hRead=GetStdHandle(…)/*获取标准输入句柄*/▪hWrite=GetStdHandle(…)/*获取标准输出句柄*/▪}▪void CParentView::OnPipeRead()▪{▪ /*定义一个字符数组,用于存放读取的数据*/▪if(!ReadFile(…)) /*读取数据*/▪{▪ /*显示消息“读取数据失败!”*/▪ /*退出*/▪}▪/*打印读取的数据*/▪/*退出*/▪}▪void CParentView::OnPipeWrite()▪{▪/*定义一个字符数组,用于存放写入的数据*/▪if(!WriteFile(…)) /*写入数据*/▪{▪ /*显示消息“写入数据失败!”*/▪ /*退出*/▪}#######################父进程代码####################### void CFatherView::OnPipeCreate(){// TODO: Add your command handler code hereSECURITY_ATTRIBUTES sa;sa.bInheritHandle=TRUE;sa.lpSecurityDescriptor=NULL;sa.nLength=sizeof(SECURITY_ATTRIBUTES);if(!CreatePipe(&hRead,&hWrite,&sa,0)){MessageBox("创建管道失败!");return;}STARTUPINFO sui;PROCESS_INFORMATION pi;ZeroMemory(&sui,sizeof(STARTUPINFO));//将数据清零sui.cb=sizeof(STARTUPINFO);sui.dwFlags=STARTF_USESTDHANDLES;sui.hStdInput=hRead;sui.hStdOutput=hWrite;sui.hStdError=GetStdHandle(STD_ERROR_HANDLE);if(!CreateProcess("H:\\OS作业\\Experiment1_匿名管道通信\\Child\\Debug\\child.exe",NULL,NULL,NULL,TRUE,0,NULL,NU LL,&sui,&pi)){CloseHandle(hRead);CloseHandle(hWrite);//关闭句柄,将内核对象的使用计数减1,这样当操作系统发现内核对象//的使用计数为0时,将清除内核对象。
hRead=NULL;hWrite=NULL;MessageBox("创建子进程失败!");—return;}else{CloseHandle(pi.hProcess);CloseHandle(pi.hThread);}}void CFatherView::OnRead(){// TODO: Add your command handler code herechar buf[100];DWORD dwRead;if(!ReadFile(hRead,buf,100,&dwRead,NULL)){MessageBox("读取数据失败!");return;}MessageBox(buf);}void CFatherView::OnInput(){// TODO: Add your command handler code herechar buf[]="你好,我是父进程!";DWORD dwWrite;if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL)) {MessageBox("写入数据失败!");return;}}#######################子进程代码####################### void CChildView::OnInput(){// TODO: Add your command handler code herechar buf[100];DWORD dwRead;if(!ReadFile(hRead,buf,100,&dwRead,NULL)){MessageBox("读取数据失败!");return;}MessageBox(buf);}void CChildView::OnWrite(){// TODO: Add your command handler code herechar buf[]="匿名管道测试程序";DWORD dwWrite;if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL)) {MessageBox("写入数据失败!");return;}}void CChildView::OnInitialUpdate(){CView::OnInitialUpdate();// TODO: Add your specialized code here and/or call the base classhRead=GetStdHandle(STD_INPUT_HANDLE);hWrite=GetStdHandle(STD_OUTPUT_HANDLE);}四、执行结果与分析创建管道:父进程向子进程发送信息:子进程向父进程发送信息:五、思考与收获这是第一次上机实验,本来没有学过C++,只有C的编程基础,初接触MFC,觉得编程十分吃力,经过辅导老师多次耐心的演示,和指导着做,终于能够自己按流程走一遍。
感觉很有收获,主要是这些课上学到的知识,在生活中很难接触到,通过上机让我真正的能够用代码来操纵计算机的操作系统去工作,减少了理论与实践的差距,让我觉得课堂不再枯燥和空洞。
这次实验让我对管道这种进程间的通信方法有了很直观的感受,通过人机交互的方式,手动地在进程间选择发送和接受数据,强化了对管道通信特点(连接于两个进程之间,以先进先出的方式实现消息的单向传送)的认识。
实验二、创建进程一、实验目的学会通过基本的Windows或者Linux进程控制函数,由父进程创建子进程,并实现父子进程协同工作。
二、实验内容创建两个进程,让子进程读取一个文件,父进程等待子进程读取完文件后继续执行,实现进程协同工作。
进程协同工作就是协调好两个进程,使之安排好先后次序并以此执行,可以用等待函数来实现这一点。
当需要等待子进程运行结束时,可在父进程中调用等待函数。
假设现在有这样的一个工作,需要计算1——100的和,还需要做一个工作是读写文件。
我们可以让父进程计算,创建一个子进程实现读写文件。
三、设计与实现过程主要工作:❝1、首先由父进程创建子进程❝2、让子进程创建一个文件并写入数据,子进程写文件过程中,父进程继续执行计算工作❝3、等子进程执行完以后,父进程读取文件内容输出,实现进程协同工作。
父进程框架❝void main()❝{❝//为创建进程做准备工作❝//创建子进程❝If(创建失败)❝返回❝Else(创建成功)❝//执行计算1——100的和❝//等子进程执行完,读取子进程的文件内容,并输出。
❝}子进程框架❝void main()❝{❝//创建文件❝If(失败)❝返回❝Else(成功)❝//向文件写入数据❝//读取文件内容输出❝}######################父进程代码######################int main(){int i;int sum=0;char Read[100]="";PROCESS_INFORMATION pi;STARTUPINFO sui; //创建进程的准备工作ZeroMemory(&sui,sizeof(sui));sui.cb=sizeof(STARTUPINFO);if(!CreateProcess("H:\\OS作业\\Experiment2_创建进程\\Child\\Debug\\child.exe",NULL,NULL,NULL,FALSE,CREATE_NEW_ CONSOLE,NULL,NULL,&sui,&pi))return 0;else //创建成功//父进程继续执行for(i=1;i<=100;i++){sum+=i;Sleep(10);printf("sum=%d\n",sum);}WaitForSingleObject(pi.hProcess,INFINITE);FILE *pfile1=fopen("H:\\OS作业\\Experiment2_创建进程\\kang.txt","r");fread(Read,sizeof(char),100,pfile1); //fread 第二个参数是每个字符的大小//文件打开方式需改为可读写fclose(pfile1);printf("%s\n",Read);return 0;}######################子进程代码######################int main(){char *Contents="You've made it,aha!\n";char Read[100]="";for(int i=0;i<100;i++){printf("%s",Read+i);}FILE *pfile=fopen("H:\\OS作业\\Experiment2_创建进程\\kang.txt","w+");if(NULL==pfile) //地址双斜线return 0;elseprintf("创建文件文件成功\n");Sleep(500);fwrite(Contents,strlen(Contents),1,pfile);fwrite("You're great!",strlen("You'regreat!"),1,pfile);fclose(pfile);printf("文件成功写入\n");Sleep(500);FILE *pfile1=fopen("H:\\OS作业\\Experiment2_创建进程\\kang.txt","r");fread(Read,sizeof(char),strlen(Contents)+strlen("You're great!"),pfile1); //fread 第二个参数是每个字符的大小 //文件打开方式需改为可读写fclose(pfile1);printf("%s\n",Read);return 0;}四、执行结果与分析父进程执行结果:子进程执行结果:五、思考与收获这次实验通过学习使用windows下的进程创建函数,能够自己创建进程并让两个进程同时工作,并通过等待函数实现两进程的同步。