ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:480.48KB ,
资源ID:544908      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-544908.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统实验报告.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

操作系统实验报告.docx

1、操作系统实验报告操作系统实验报告实验三 一个进程启动另一个程序的执行【实验目的】 在 Linux 环境系统中, execve 系统调用用于执行一个程序(可执行二进制文件或脚本)。exec 函数家族,包括 execl、execlp、execle、execv、execvp,是 execve 系统调用的前端。本实验要求学生学习在一个进程中启动另一个程序执行的基本方法,了解 execve 系统调用和 exec 函数家族的使用方法。【实验内容】(一)初步认识“在一个进程中启动另一个程序的执行”。1、编辑一个源程序 dummy.c,并编译为可执行程序 dummy。/ dummy.c#include #in

2、clude #include #include int main(int argc, char *argv) int result; printf(nYou are now in a running program %s. n, argv0); printf(My PID is %d. My parents PID is %d.n, getpid(), getppid(); printf( Please input an integer (0-255), which will be returned to my parent process:n); scanf(%d, &result); pr

3、intf(Goodbye.nn); return (result &0377);2、再编辑一个源程序 exec_test.c,并编译为可执行程序 exec_test。/ exec_test.c#include #include #include #include #include #include int main(int argc, char *argv) int result; result = fork(); if (result 0) perror(Failed to create child); exit(1); else if (result = 0) / Child 1 char

4、 *cmd = ./dummy; printf(Child processs PID is %d. My parents PID is %d.n, getpid(), getppid(); printf(Child process is about to execute %snn, cmd); result = execlp(cmd, cmd, NULL); if (result = - 1) perror(In child process, failed to exec a program); exit(0); else / parent int status; printf(Parent

5、processs PID is %d.n, getpid(); printf(Parent process is waiting . n); wait(&status); printf( In parent process, status = 0x%x, WEXITSTATUS(status) = %d (i.e. 0x%x)n, status, WEXITSTATUS(status), WEXITSTATUS(status); return (EXIT_SUCCESS);3、先执行 dummy,观察、分析执行结果;然后执行程序 exec_test,观察、分析执行结果。(注意,两个可执行程序都

6、在当前目录下)(二)实现一个简单的命令解释外壳(Shell)。1、基本功能:(1)从标准输入读取一行字符串,其中包含欲执行的命令和它的命令行参数(如果有的话)。提示:需要将输入的一行字符串进行拆分,以空格、制表符(t)作为分隔符,分解为命令、命令行参数(零个或多个)。如果用户输入的命令是“quit”,则退出执行。(2)创建一个子进程。(3)在子进程中,执行在(1)读入的命令,如果有命令行参数,也要传递。(4)在父进程中,等待子进程结束,然后打印子进程的返回值。(5)在父进程中,控制转移至(1)。【实验要求】 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验

7、报告。【实验设计】dummy程序:结果显示了该进程的PID和父进程的PID,并且将一个值返回给了父进程。exec_test程序:在子进程中键入的数值返回了父进程,并显示了出来(19).实现一个简单的命令解释外壳(Shell)源代码:/example#include#include#include#include#include#include#includeint main() int pid; int rtn; /子进程的返回值 int exec_errorno; char command256; char * p; char * q; char *c20; int i=0,j=0; whi

8、le(1) / 从 终端 读取要执行的 命令 printf(); command0=0; p= fgets(command,256,stdin); if (p= NULL) perror(Error in fgets().); exit(-1); /Delete the last char (new line) in the string returned by fgets() commandstrlen(command)-1 = 0; p=command; q=p; /Quit if user inputs quit if (!strcmp(command,quit) break; /Cre

9、ate a child process to execute command pid = fork(); if (pid0) perror(Failed while calling fork.); exit(-1); else if(pid = 0) /子进程 执行此命令 for(;) ci=strtok(p, ); if(ci=NULL) break; i+; p=NULL; p=c0; for(j=0;ji;j+) printf(%s n,cj); exec_errorno = execvp(p,c); /如果 exec 函数返回,表明没有正常执行命令 /只有在这种情况下, 才会执行下面的

10、打印错误信息 perror(command); exit(exec_errorno); else /父进程,等待子进程结束,并打印子进程的返回值 wait(&rtn); printf(n Value returned from child process, rtn =%dn,rtn); printf(WEXITSTATUS(rtn) = %dn,WEXITSTATUS(rtn); return 0; 【实验测试结果及分析】此程序通过对execvp()函数的调用,使得通过输入命令被执行。输入的命令用fgets()存入command字符串中,然后反复调用strtok()函数,分割所得字符串,达到将

11、命令分割的目的,使得多命令行参数得以实现。【运行结果】【收获及体会】实验指导书在实验调试和分析的过程中,我越来越懂得自学能力和自我独立解决问题的重要性。在以后的实验和学习中,我会不断的加强对这方面的训练。【参考资料】实验指导书实验五 线程间的互斥与同步【实验目的】理解 POSIX 线程(Pthread)互斥锁和 POSIX 信号量机制,学习它们的使用方法;编写程序,实现多个 POSIX 线程的同步控制。【实验内容】创建 4 个 POSIX 线程。其中 2 个线程(A 和 B)分别从 2 个数据文件(data1.txt 和 data2.txt)读取 10 个整数. 线程 A 和 B 把从文件中读

12、取的逐一整数放入一个缓冲池. 缓冲池由 n 个缓冲区构成(n=5,并可以方便地调整为其他值),每个缓冲区可以存放一个整数。另外 2 个线程,C 和 D,各从缓冲池读取 10 数据。线程 C、D 每读出 2 个数据,分别求出它们的和或乘积,并打印输出。提示:(1)在创建 4 个线程当中,A 和 B 是生产者,负责从文件读取数据到公共的缓冲区,C 和 D 是消费者,从缓冲区读取数据然后作不同的计算(加和乘运算)。使用互斥锁和信号量控制这些线程的同步。不限制线程 C 和 D 从缓冲区得到的数据来自哪个文件。(2)在生产者线程中,确保从文件读出数据以后,再去“生产”。在开始设计和实现之前,务必认真阅读

13、下列内容: 课本 6.8.4 节; 讲义(课堂 PPT)中关于“生产者-消费者问题”的部分; 课本第 6 章后面的编程项目生产者-消费者问题。【实验要求】 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。【实验设计】#include #include #include #include #include #define NUM_THREADS 5int buffer5;int in = 0; /写入标识int out = 0; /读取标识pthread_mutex_t mutex2in, mutex2out;sem_t wri, rea;void *

14、write1(void *arg) FILE *fp1 = fopen(data1.txt, r); int w1; int i1 = 0; for (i1 = 0; i1 10; i1+) /P(写资源) sem_wait(&wri); /从文件中读取一个文件 if (fscanf(fp1, %d, &w1) ; else printf(Im the pthread write1,I cant read a num from data1.txt.n); exit(1); /放入缓存对应位置 /加 in 锁 pthread_mutex_lock(&mutex2in); bufferin = w

15、1; in = (in + 1) % NUM_THREADS; /解 in 锁 pthread_mutex_unlock(&mutex2in); /V(读资源) sem_post(&rea); /线程结束 fclose(fp1); pthread_exit(NULL);void *write2(void *arg) int w2; FILE *fp2 = fopen(data2.txt, r); int i2 = 0; for (i2 = 0; i2 10; i2+) /P(写资源) sem_wait(&wri); /从文件中读取一个文件 if (fscanf(fp2, %d, &w2) ;

16、else printf(Im the pthread write1,I cant read a num from data1.txt.n); exit(1); /放入缓存对应位置 /加 in 锁 pthread_mutex_lock(&mutex2in); bufferin = w2; in = (in + 1) % NUM_THREADS; /解 in 锁 pthread_mutex_unlock(&mutex2in); /V(读资源) sem_post(&rea); /线程结束 fclose(fp2); pthread_exit(NULL);void *plus(void *arg) /加

17、进程 int a1, b1, c1; int p = 0; for (p = 0; p 5; p+) /P(读资源) sem_wait(&rea); /从缓冲中读取一个文件 /加 out 锁 pthread_mutex_lock(&mutex2out); a1 = bufferout; out = (out + 1) % NUM_THREADS; /解 out 锁 pthread_mutex_unlock(&mutex2out); /V(写资源) sem_post(&wri); /P(读资源) sem_wait(&rea); /加 out 锁 pthread_mutex_lock(&mutex

18、2out); /从缓冲中读取一个文件 b1 = bufferout; out = (out + 1) % NUM_THREADS; /解 out 锁 pthread_mutex_unlock(&mutex2out); c1 = a1 + b1; /计算求 和 并且输出到屏幕 printf(Im the pthread of plusing,this is my result:t %d + %d = %d. n, a1, b1, c1); /V(写资源) sem_post(&wri); /线程结束 pthread_exit(NULL);void *mult(void *arg) /乘进程 int

19、 a2, b2, c2; int p = 0; for (p = 0; p 5; p+) /P(读资源) sem_wait(&rea); /加 out 锁 pthread_mutex_lock(&mutex2out); /从缓冲中读取一个文件 a2 = bufferout; out = (out + 1) % NUM_THREADS; /解 out 锁 pthread_mutex_unlock(&mutex2out); /V(写资源) sem_post(&wri); /P(读资源) sem_wait(&rea); /加 out 锁 pthread_mutex_lock(&mutex2out);

20、 /从缓冲中读取一个文件 b2 = bufferout; out = (out + 1) % NUM_THREADS; /解 out 锁 pthread_mutex_unlock(&mutex2out); c2 = a2 * b2; /计算求 积 并且输出到屏幕 printf( Im the pthread of multiplying,this is my result:t %d * %d = %d. n, a2, b2, c2); /V(写资源) sem_post(&wri); /线程结束 pthread_exit(NULL);int main() /互斥锁初始化 pthread_mute

21、x_init(&mutex2in, NULL); pthread_mutex_init(&mutex2out, NULL); pthread_t A, B, C, D; int err; /信号量初始化 sem_init(&wri, 0, 5); sem_init(&rea, 0, 0); /创建线程1 err = pthread_create(&A, NULL, write1, NULL); if (err != 0) printf(cant create myThread1:%sn, strerror(err); /创建线程2 err = pthread_create(&B, NULL,

22、write2, NULL); if (err != 0) printf(cant create myThread2:%sn, strerror(err); /稍微延迟 sleep(0.1); /创建线程3 err = pthread_create(&C, NULL, plus, NULL); if (err != 0) printf(cant create myThread3:%sn, strerror(err); /创建线程4 err = pthread_create(&D, NULL, mult, NULL); if (err != 0) printf(cant create myThre

23、ad4:%sn, strerror(err); pthread_join(A, NULL); pthread_join(B, NULL); pthread_join(C, NULL); pthread_join(D, NULL); return 0;【收获及体会】在完成上次实验时,我在网上找到了一片相关文章,里面稍有提及互斥锁的知识,当时我粗略看了一下。没想到这次试验的主体内容就是使用互斥锁和信号量。简而言之,互斥锁是对互斥资源进行限制访问,以防止不同线程(进程)同时对某个资源进行访问,而导致资源的状态不明,出乎意料,用来实现互斥的。进而在使用共有资源时,例如本题中的标识量in,out时候,就需要加锁和解锁,以达到在访问in,out时候,只有某一个线程访问此资源,就不会导致资源的状态混乱。而信号量是用于实现进程同步的,一般是为了使若干线程(进程)之间运行先后有序。本例中,读取线程一定要在计算线程之前,因而使用信号量,来控制线程之间的先后顺序。通过本次实验,我也复习了之前学过的一些C语言知识。包括文件的读取与写入,线程的创建与结束等。这次实验很有意义,我收获很多。【参考资料】实验指导书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2