版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统实验报告专业:物联网工程实验三一个进程启动另一个程序的执行【实验目的】在Linux环境系统中,execve系统调用用于执行一个程序(可执行二进制文件或脚本)。exec函数家族,包括execl、execlp、execle、execv、execvp,是execve系统调用的前端。本实验要求学生学习在一个进程中启动另一个程序执行的基本方法,了解execve系统调用和exec函数家族的使用方法。【实验内容】(一)初步认识“在一个进程中启动另一个程序的执行”。1、编辑一个源程序dummy.c,并编译为可执行程序dummy。//dummy.c#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<unistd.h>intmain(intargc,char**argv){intresult;printf("\nYouarenowinarunningprogram\"%s\".\n",argv[0]);printf("MyPIDis%d.Myparent'sPIDis%d.\n",getpid(),getppid());printf("Pleaseinputaninteger(0-255),whichwillbereturnedtomyparentprocess:\n");scanf("%d",&result);printf("Goodbye.\n\n");return(result&0377);}}2、再编辑一个源程序exec_test.c,并编译为可执行程序exec_test。//exec_test.c#include<stdio.h>#include<stdlib.h>#include<error.h>#include<sys/types.h>#include<unistd.h>#include<sys/wait.h>intmain(intargc,char**argv){intresult;result=fork();if(result<0){perror("Failedtocreatechild");exit(1);}elseif(result==0){//Child1char*cmd="./dummy";printf("Childprocess'sPIDis%d.Myparent'sPIDis%d.\n",getpid(),getppid());printf("Childprocessisabouttoexecute\"%s\"\n\n",cmd);result=execlp(cmd,cmd,NULL);if(result==-1){perror("Inchildprocess,failedtoexecaprogram");}exit(0);}else{//parentintstatus;printf("Parentprocess'sPIDis%d.\n",getpid());printf("Parentprocessiswaiting...\n");wait(&status);printf("Inparentprocess,status=0x%x,WEXITSTATUS(status)=%d(i.e.0x%x)\n",\status,WEXITSTATUS(status),WEXITSTATUS(status));}return(EXIT_SUCCESS);}先执行dummy,观察、分析执行结果;然后执行程序exec_test,观察、分析执行结果。(注意,两个可执行程序都在当前目录下)(二)实现一个简单的命令解释外壳(Shell)。1、基本功能:(1)从标准输入读取一行字符串,其中包含欲执行的命令和它的命令行参数(如果有的话)。提示:需要将输入的一行字符串进行拆分,以空格、制表符(\t)作为分隔符,分解为命令、命令行参数(零个或多个)。如果用户输入的命令是“quit”,则退出执行。(2)创建一个子进程。(3)在子进程中,执行在(1)读入的命令,如果有命令行参数,也要传递。(4)在父进程中,等待子进程结束,然后打印子进程的返回值。(5)在父进程中,控制转移至(1)。【实验要求】按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。【实验设计】dummy程序:结果显示了该进程的PID和父进程的PID,并且将一个值返回给了父进程。exec_test程序:在子进程中键入的数值返回了父进程,并显示了出来(19).实现一个简单的命令解释外壳(Shell)源代码://example#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<unistd.h>#include<errno.h>#include<sys/wait.h>#include<string.h>intmain(){ intpid; intrtn;//子进程的返回值 intexec_errorno; charcommand[256]; char*p; char*q; char*c[20]; inti=0,j=0; while(1){ //从终端读取要执行的命令 printf(">"); command[0]='\0'; p=fgets(command,256,stdin); if(p==NULL){ perror("Errorinfgets()."); exit(-1); } //Deletethelastchar(newline)inthestringreturnedbyfgets() command[strlen(command)-1]='\0'; p=command; q=p; //Quitifuserinputs"quit" if(!strcmp(command,"quit")){ break; } //Createachildprocesstoexecutecommand pid=fork(); if(pid<0){ perror("Failedwhilecallingfork."); exit(-1); } elseif(pid==0){ //子进程执行此命令 for(;;){ c[i]=strtok(p,""); if(c[i]==NULL){ break; } i++; p=NULL; } p=c[0]; for(j=0;j<i;j++){ printf("%s\n",c[j]); } exec_errorno=execvp(p,c); //如果exec函数返回,表明没有正常执行命令 //只有在这种情况下,才会执行下面的打印错误信息 perror(command); exit(exec_errorno); } else{ //父进程,等待子进程结束,并打印子进程的返回值 wait(&rtn); printf("\nValuereturnedfromchildprocess,rtn=%d\n",rtn); printf("WEXITSTATUS(rtn)=%d\n",WEXITSTATUS(rtn)); } } return0; } 【实验测试结果及分析】此程序通过对execvp()函数的调用,使得通过输入命令被执行。输入的命令用fgets()存入command字符串中,然后反复调用strtok()函数,分割所得字符串,达到将命令分割的目的,使得多命令行参数得以实现。【运行结果】【收获及体会】实验指导书在实验调试和分析的过程中,我越来越懂得自学能力和自我独立解决问题的重要性。在以后的实验和学习中,我会不断的加强对这方面的训练。【参考资料】实验指导书实验五线程间的互斥与同步【实验目的】理解POSIX线程(Pthread)互斥锁和POSIX信号量机制,学习它们的使用方法;编写程序,实现多个POSIX线程的同步控制。【实验内容】创建4个POSIX线程。其中2个线程(A和B)分别从2个数据文件(data1.txt和data2.txt)读取10个整数.线程A和B把从文件中读取的逐一整数放入一个缓冲池.缓冲池由n个缓冲区构成(n=5,并可以方便地调整为其他值),每个缓冲区可以存放一个整数。另外2个线程,C和D,各从缓冲池读取10数据。线程C、D每读出2个数据,分别求出它们的和或乘积,并打印输出。提示:(1)在创建4个线程当中,A和B是生产者,负责从文件读取数据到公共的缓冲区,C和D是消费者,从缓冲区读取数据然后作不同的计算(加和乘运算)。使用互斥锁和信号量控制这些线程的同步。不限制线程C和D从缓冲区得到的数据来自哪个文件。(2)在生产者线程中,确保从文件读出数据以后,再去“生产”。在开始设计和实现之前,务必认真阅读下列内容:课本6.8.4节;讲义(课堂PPT)中关于“生产者-消费者问题”的部分;课本第6章后面的编程项目——生产者-消费者问题。【实验要求】按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。【实验设计】#include<stdio.h>#include<pthread.h>#include<semaphore.h>#include<stdlib.h>#include<unistd.h>#defineNUM_THREADS5intbuffer[5];intin=0;//写入标识intout=0;//读取标识pthread_mutex_tmutex2in,mutex2out;sem_twri,rea;void*write1(void*arg){FILE*fp1=fopen("data1.txt","r");intw1;inti1=0;for(i1=0;i1<10;i1++){//P(写资源)sem_wait(&wri);//从文件中读取一个文件if(fscanf(fp1,"%d",&w1));else{printf("I'mthepthreadwrite1,Ican'treadanumfromdata1.txt.\n");exit(1);}//放入缓存对应位置//加in锁pthread_mutex_lock(&mutex2in);buffer[in]=w1;in=(in+1)%NUM_THREADS;//解in锁pthread_mutex_unlock(&mutex2in);//V(读资源)sem_post(&rea);}//线程结束fclose(fp1);pthread_exit(NULL);}void*write2(void*arg){intw2;FILE*fp2=fopen("data2.txt","r");inti2=0;for(i2=0;i2<10;i2++){//P(写资源)sem_wait(&wri);//从文件中读取一个文件if(fscanf(fp2,"%d",&w2));else{printf("I'mthepthreadwrite1,Ican'treadanumfromdata1.txt.\n");exit(1);}//放入缓存对应位置//加in锁pthread_mutex_lock(&mutex2in);buffer[in]=w2;in=(in+1)%NUM_THREADS;//解in锁pthread_mutex_unlock(&mutex2in);//V(读资源)sem_post(&rea);}//线程结束fclose(fp2);pthread_exit(NULL);}void*plus(void*arg){//加进程inta1,b1,c1;intp=0;for(p=0;p<5;p++){//P(读资源)sem_wait(&rea);//从缓冲中读取一个文件//加out锁pthread_mutex_lock(&mutex2out);a1=buffer[out];out=(out+1)%NUM_THREADS;//解out锁pthread_mutex_unlock(&mutex2out);//V(写资源)sem_post(&wri);//P(读资源)sem_wait(&rea);//加out锁pthread_mutex_lock(&mutex2out);//从缓冲中读取一个文件b1=buffer[out];out=(out+1)%NUM_THREADS;//解out锁pthread_mutex_unlock(&mutex2out);c1=a1+b1;//计算求和并且输出到屏幕printf("I'mthepthreadofplusing,thisismyresult:\t%d+%d=%d.\n",a1,b1,c1);//V(写资源)sem_post(&wri);}//线程结束pthread_exit(NULL);}void*mult(void*arg){//乘进程inta2,b2,c2;intp=0;for(p=0;p<5;p++){//P(读资源)sem_wait(&rea);//加out锁pthread_mutex_lock(&mutex2out);//从缓冲中读取一个文件a2=buffer[out];out=(out+1)%NUM_THREADS;//解out锁pthread_mutex_unlock(&mutex2out);//V(写资源)sem_post(&wri);//P(读资源)sem_wait(&rea);//加out锁pthread_mutex_lock(&mutex2out);//从缓冲中读取一个文件b2=buffer[out];out=(out+1)%NUM_THREADS;//解out锁pthread_mutex_unlock(&mutex2out);c2=a2*b2;//计算求积并且输出到屏幕printf("I'mthepthreadofmultiplying,thisismyresult:\t%d*%d=%d.\n",a2,b2,c2);//V(写资源)sem_post(&wri);}//线程结束pthread_exit(NULL);}intmain(){//互斥锁初始化pthread_mutex_init(&mutex2in,NULL);pthread_mutex_init(&mutex2out,NULL);pthread_tA,B,C,D;interr;//信号量初始化sem_init(&wri,0,5);sem_init(&rea,0,0);//创建线程1err=pthread_create(&A,NULL,write1,NULL);if(err!=0){printf("can'tcreatemyThread1:%s\n",strerror(err));}//创建线程2err=pthread_create(&B,NULL,write2,NULL);if(err!=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年四川盐晟国有资本投资集团有限公司招聘考试真题
- 2025年良乡第三中学教师招聘真题
- 吉安市招聘社区工作者考试真题2025
- 初中语文作文讲义 第12讲如何初步鉴赏诗歌
- 教育培训管理人员滥用职权检讨书
- 机关应急值班制度
- 机关单位电子政务管理制度
- 托育机构组织管理导论试卷及答案全套 第1-5套
- 建筑垃圾再生利用生产线调整改造项目环评报告表
- 新建甲类仓库项目环评报告表
- 劳务股东协议书
- 2026浙江湖州市公路水运工程监理咨询有限公司招聘10人笔试参考题库及答案详解
- 湖南省2026年高考招生计划-历史类
- 2026安全生产月事故案例警示教育培训(事故案例截至2026年6月)
- 建筑门窗安装施工方案
- 2026中国功能性食品原料科学认证与消费者认知调研
- 2026年山东能源集团招聘考试指南及模拟题库
- 《危险化学品安全法》与《危化品安全管理条例》条款对照表
- 2025年宁东泰畅水务公司笔试及答案
- 创新课堂教学模式实践方案汇编
- 高处作业吊篮专项施工方案完整版本
评论
0/150
提交评论