长春大学操作系统实验指导(学生版).doc_第1页
长春大学操作系统实验指导(学生版).doc_第2页
长春大学操作系统实验指导(学生版).doc_第3页
长春大学操作系统实验指导(学生版).doc_第4页
长春大学操作系统实验指导(学生版).doc_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验一 熟悉Linux环境一、实验目的:1、熟悉Linux下的基本操作命令,能在Linux下进行常用的操作。 2、了解Linux下cc或gcc编译器的使用,能运行简单的C语言程序。二、实验知识预备(Linux相关的操作命令)1、 查看文件目录的命令 lsls a 显示指定目录下所有子目录与文件,包括隐藏文件ls -ld xh 以长格式显示指定目录xh的信息 2、 改变当前目录(cd)、创建新目录(mkdir)、显示当前目录(pwd)的命令mkdir tjl 在当前目录下建立子目录tjlcd tjl 进入子目录tjlcd . 返回上一级目录pwd 显示当前工作目录的绝对路径3、 查看文件内容的命令 cat moremore linuxbook.txt 显示linuxbook.txt文件的内容cat testfile.txt 建立文件testfile.tex,文件内容由键盘输入,按下Ctrl+D组合键,存盘退出。4、 文件或目录复制的命令 cp cp file1.txt file1.txt 将当前目录下的文件file1.txt复制成file2.txt5、删除文件或目录 rm rm ile1.txt 删除当前目录下的文件file1.txt rm -i* 以交互方式删除目录下的所有非隐藏文件 rm -rf xh 强制删除当前目录下的xh子目录6、 inux下编辑文件的方法 gedit a.c 打开编辑器编写程序。7、 在Linux下编译C程序的方法 先编译: gcc a.c -o a 再执行: ./a8、 取得帮助的方法man ls9、 权限操作 chmodChmod 属性字 文件名 属性字 u-拥有者 g-组用户 o-其它用户Chmod u+x tt (将文件tt加上拥有者可执行)Chmod 700 a (设置文件a权限为可执行)Chmod +x a (同上)三、实验内容1.登录linux系统,熟悉终端窗口的操作,了解linux文件系统。2在终端练习相关的命令。3编写程序:输出显示hello,everyone!的C语言程序,并编译和执行。附录1 Linux 文件系统结构1、 Linux目录结构Linux文件系统是树状的结构,系统中每个分区都是一个文件系统,都有自己的目录层次。Linux会将这些分属不同分区的、单独的文件系统按树状的方式形成一个系统的总目录层次结构。目录提供了一个管理文件方便而有效的途径,最上层是根目录,其他的所有目录都是从根目录出发而生成的,如下图。微软的DOS和Windows也是采用树状结构,但是其树状结构的根是磁盘分区的盘符,有几个分区就有几个树状结构,它们之间的关系是并列的。但在Linux中,无论操作系统管理几个磁盘分区,这样的目录树都只有一个。 /root/bin /home /dev /etc /lib /sbin /tmp /use /var/X11R6 /src /lib /local /man /bin图 Linux的目录结构Linux使用标准的目录结构,在安装时,安装程序就已经为用户创建了文件系统和完整而固定的目录结构,并指定了每个目录的作用和其中的文件类型。2、 目录功能简介 /bin 存放常用的二进制执行命令,如ls、mv、rm、 mkdir和telnet等。通常与/usr/bin的内容是一样的。 /dev 存放与设备有关的特殊文件。基本的UNUX和Linux系统都将设备当成文件,如/dev/fd0代表软盘,/dev/cdrom则表示光盘。/etc 存放系统管理和配置文件,如LILO的参数、用户的账号和密码,以及系统的主要设置。/home 为用户设置的目录,比如用户服务user的主目录就是/home/usre。/lib 标准程序设计库,又叫动态链接共享库,在Linux执行或编译内核时,均会用到。/slib 系统管理命令,存放的是系统管理员使用的管理程序,如fdisk、mount、 mkswap等。/boot 放置Linux核心与启动和关闭系统有关的文档。/tmp 公用的临时文件存储点。/root 系统管理员的主目录。/mnt 系统提供这个目录是让用户临时装载其他的文件系统,如装载软盘的文件系统。/lost+found 这个目录平时是空的,系统非正常关机时而留下的文件会放在这里。类似于Windows下的*.chk文件。/proc 虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。/var 这是系统在工作时预先设置的工作目录,如各种服务的日志文件和收发的邮件等。/use 最庞大和最重要的目录之一,要用到的应用程序和文件几乎都在这个目录下。其中主要有:/usr/X11R6 存放X Windows的目录。/usr/bin 众多的应用程序。/usr/sbin 超级用户的一些管理程序。/usr/doc Linux系统的说明文档。/usr/include Linux下开发和编译应用程序所需要的头文件。/usr/lib 存放常用的动态链接训和软件包的配置文件。/usr/man 存储帮助文档。/usr/src Linux内核的源代码就放在这里,编译内核时必须用到。/usr/local/bin 本地增加的命令,通常用于软件的升级。/usr/local/lib 本地增加的库。实验二 进程管理一、实验目的(1 )加深对进程概念的理解,明确进程和程序的区别。(2)进一步认识并发执行的实质。(3)学习通过进程执行新的目标程序的方法。二、实验知识预备三、实验内容1如何获得当前进程和父进程的ID号,以及其用户和组的相关信息( pid.c)。#include #include #include int main() pid_t myPid; pid_t myParentPid; gid_t myGid; uid_t myUid; myPid=getpid(); myParentPid=getppid(); myGid=getgid(); myUid=getuid(); printf(my process id is %dn,myPid); printf(my parents process id is %dn,myParentPid); printf(my user id is %dn,myUid); printf(my group id is %dn,myGid); return 0; 2一个程序如何运行另一个程序 答案:调用execvpexccvp目标在指定路径中查找并执行一个文件头文件#include函数Result=execvp(const char *file,const char *argv)参数File 要执行的文件名Argv 字符串数组返回值-1 如果出错例:exec_test.c#include #include #include #include #include int main(int argc, char *argv) /以NULL结尾的字符串数组的指针,适合包含v的exec函数参数 char *arg = ls, -a, NULL; /* * 创建子进程并调用函数execl * execl 中希望接收以逗号分隔的参数列表,并以NULL指针为结束标志 */ if( fork() = 0 ) / in clild printf( 1-execl-n ); if( execl( /bin/ls, ls,-a, NULL ) = -1 ) perror( execl error ); exit(1); sleep(1); /* *创建子进程并调用函数execv *execv中希望接收一个以NULL结尾的字符串数组的指针 */ if( fork() = 0 ) / in child printf(2-execv-n); if( execv( /bin/ls,arg) 0) perror(execv error ); exit(1); sleep(1); /* *创建子进程并调用 execlp *execlp中 *l希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志 *p是一个以NULL结尾的字符串数组指针,函数可以DOS的PATH变量查找子程序文件 */ if( fork() = 0 ) / in clhild printf(3-execlp-n); if( execlp( ls, ls, -a, NULL ) 0 ) perror( execlp error ); exit(1); sleep(1); /* *创建子里程并调用execvp *v 望接收到一个以NULL结尾的字符串数组的指针 *p 是一个以NULL结尾的字符串数组指针,函数可以DOS的PATH变量查找子程序文件 */ if( fork() = 0 ) printf(4-execvp-n); if( execvp( ls, arg ) 0 ) perror( execvp error ); exit( 1 ); sleep(1); /* *创建子进程并调用execle *l 希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志 *e 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境 */ if( fork() = 0 ) printf(5-execle-n); if( execle(/bin/ls, ls, -a, NULL, NULL) = -1 ) perror(execle error ); exit(1); sleep(1); /* *创建子进程并调用execve * v 希望接收到一个以NULL结尾的字符串数组的指针 * e 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境 */ if( fork() = 0 ) printf(6-execve-n); if( execve( /bin/ls, arg, NULL ) = 0) perror(execve error ); exit(1); return 0;2 如何建立新的进程 Fork目标创建进程头文件#include函数Pid_t=fork(void)参数没有返回值-1 如果出错0 返回到子进程Pid 将进程的进程ID传给父进程例:#includemain()int fork_rv; print(before:my pid is %dn,getpid(); fork_rv=fork();if (fork_rv=-1) perror(fork);else if(fork_rv=0) printf(“I am the child.mypid=%dn”,getpid();else printf(“I am the parent,my child.is %dn”,fork_rv);运行结果: before:my pid is 5931 I am the parent,my child is 5932 I am the child, my pid=5932 3vfork(1)执行程序fork.c,写出输出结果。#include #include #include #include int main()pid_t pid;/ pid 实质是一个整数int n = 0;/定义一个局部变量pid = fork();/创建进程if(pid 0)/返回值大于0,表示是父进程,返回的子进程IDwhile(1)printf(this is father processn);printf(father n=%dn,n);sleep(1);/休眠一秒钟return 0;(2)执行程序vfork.c,写出输出结果。#include #include #include #include int main()pid_t pid;/ pid 实质是一个整数int n = 0;/定义一个局部变量pid = vfork();/创建进程if(pid =3)break;exit(1);if(pid 0)/返回值大于0,表示是父进程,返回的子进程IDwhile(1)printf(this is father processn);printf(father n=%dn,n);sleep(1);/休眠一秒钟return 0;4 终止进程#include#includeint main()printf(using _exit-n);printf(This is the content in buffer);_exit(0); #include#includeint main()printf(using exit-n);printf(This is the content in buffer);exit(0); 5 父进程如何等待子进程的退出 Wait目标等待进程结束头文件#include#include函数Pid_t result=wait(int * statusptr)参数Statusptr子进程的运行结果返回值-1 如果出错Pid 结束进程的进程ID例:waitdemo.c#includemain()int newpid;int delay=2; int child_code(),parent_code(); printf(before:mypid is %dn,getpid(); if(newpid=fork()=-1) perror(fork);else if(newpid=0) child_code(delay);else parent_code(newpid);int child_code(int delay) printf(child %d here.will sleep for %d secondsn,getpid(),delay); sleep(delay); printf(child done.about to exitn); exit(17);int parent_code(int childpid)int wait_rv; wait_rv=wait(0); printf(done waiting for %d.wait returned:%dn,childpid,wait_rv);运行结果: befora:mypid is 10328 child 10329 here.will sleep for 2 seconds child done. About to exit do waiting for 10329.wait returned:10329实验三 编程实现自己的shell一、实验目的了解shell的功能和其执行程序的过程,编写自己的shell程序。二、实验知识预备1. 通过PS命令查看用户空间的进程 $ps pid tty time cmd 1775 pts/1 00:00:17 bash 1981 pts/1 00:00:00 ps 可以设置参数: -a :列出所在进程,包括其他终端由其他用户运行 的程序。 -l:更出各个进程的详细状态。2shell进程控制和程序控制的一个工具Shell是一个管理进程和运行进程的程序。有三个主要功能。(1)运行程序:shell是一个程序启动器。(2)管理输入和输出:shell将进程的输入和输出连接到一个文件或其他的进程。(3)编程3shell如何运行程序的(1)用户键入程序名 a.out(2)Shell建立一个新的进程来运行这个程序;(3)Shell将程序从磁盘载入(4)程序在它的进程中运行直到结束4如何编程实现自己的shell为了要写一个shell,需要:(1)运行一个程序(2)建立一个进程(3)等待exit()三、实验内容1编辑程序psh1.c,编译并执行。#include#include#include#define maxargs 20#define arglen 100int main()char *arglistmaxargs+1; int numargs; char argbufarglen; char *makestring(); numargs=0; while(numargs0)arglistnumargs=0; execute(arglist); numargs=0; return 0;int execute(char *arglist)execvp(arglist0,arglist);perror(execvp failed);exit(1);char *makestring(char *buf)char *cp,*malloc(); bufstrlen(buf)-1=0; cp=malloc(strlen(buf)+1); if(cp=0)fprintf(stderr,no memoryn); exit(1);strcpy(cp,buf);return cp;2编辑程序psh2.c,编译并执行。#include#include#include#define maxargs 20#define arglen 100int main()char *arglistmaxargs+1; int numargs; char argbufarglen; char *makestring(); numargs=0; while(numargs0)arglistnumargs=0; execute(arglist); numargs=0; return 0;int execute(char *arglist)int pid,exitstatus;pid=fork();switch(pid)case -1:perror(fork failed); exit(1);case 0: execvp(arglist0,arglist); perror(excvp failed); exit(1);default:while(wait(&exitstatus)!=pid); printf(child exited with status %d,%dn,exitstatus8,exitstatus&0377);char *makestring(char *buf)char *cp,*malloc(); bufstrlen(buf)-1=0; cp=malloc(strlen(buf)+1); if(cp=0)fprintf(stderr,no memoryn); exit(1);strcpy(cp,buf);return cp;3测试运行结果(1)分别执行psh1和psh2,执行过程中,输入ps命令写出两个程序运行的结果。并分析区别和原因。(2)在执行psh2过程程,输入./psh1和ps命令写程序运行的结果。、实验四 线程通讯一、实验目的用clone()创建四个轻进程(线程),用参数指明共享内存等资源,通过共享内存模拟生产者-消费者问题。二、实验知识预备1.int clone(int(*fn)(void *arg),void *stack, int flag,void *arg); fn-轻进程所执行的函数;stack-所使用的栈 arg-是调用过程的对应参数 flag-是组合值 CLONE_VM:表示子进程共享父进程内存 CLONE_FS:表示子进程共享父进程的文件系统 CLONE_SIGHAND:表示子进程共享父进程的消息处理机制 CLONE_PID:指子进程继承父进程的id号2. 信号灯类Sem_t sSem_init(s,m,n)sem_wait(&s)Sem_post(&s)3.互斥锁类Pthread_mutex_t mutexPthread_mutex_init(&mutex,NULL)Pthread_mutex_lock(&mutex)Pthread_mutex_unlock三、实验内容1编辑程序 clone.c#include #include #include #include #include int producer(void *args);int consumer(void *args);pthread_mutex_t mutex;sem_t product;sem_t warehouse;char buffer84;int bp=0;main(int argc,char *argv) pthread_mutex_init(&mutex,NULL); sem_init(&product,0,0); sem_init(&warehouse,0,8); int clone_flag,arg,retval; char *stack; clone_flag=CLONE_VM; int i; for(i=0;i2;i+) arg=i; stack=(char*)malloc(4096); retval=clone(void*)producer,&(stack4095),clone_flag, (void*)&arg); stack=(char*)malloc(4096); retval=clone(void*)consumer,&(stack4095),clone_flag, (void*)&arg); exit(1);int producer(void *args) int id=*(int*)args); int i; for(i=0;i10;i+) sleep(i+1); sem_wait(&warehouse); pthread_mutex_lock(&mutex); if(id=0) strcpy(bufferbp,aaa0); else strcpy(bufferbp,bbb0); bp+; printf(producer %d produce %s in %dn,id,bufferbp,bp-1); pthread_mutex_unlock(&mutex); sem_post(&product); printf(producer %d is over!n,id); int consumer(void *args) int id=*(int*)args); int i; for(i=0;i10;i+) sleep(10-i); sem_wait(&product); pthread_mutex_lock(&mutex); bp-; printf(consumer %d get %s in %d n,id,bufferbp,bp+1); strcpy(bufferbp,zzz0); pthread_mutex_unlock(&mutex); sem_post(&warehouse); printf(consumer %d is over!n,id); 2编译gcc clone.c -o cl lpthread3.执行4分析执行的结果实验五 进程高级通讯一、实验目的:用Pipe()创建一个管道,然后用fork()创建两个生产进程和两个消费进程,它们之间能过pipe()传递信息。二、实验知识预备1. pid=fork() 创建一个子进程,子进程是父进程的完整复制。 返回值对于父进程,是子进程的ID,对于子进程值为0。2Ret_val=pipe(fd) 创建一个管道文件,参数定义为int fd2 返回值为两个文件描述符,放置在fd中。 fd0用于管道文件的读fd1用于管道文件的写3子进程1: write(fd1,buf1,count1);子进程2: read(fd0,buf2,count2)三、实验内容1编辑程序 jc.c#include sys/types.h#include sys/file.h#include unistd.hchar r_buf4;char w_buf4;int pipe_fd2;pid_t pid1,pid2,pid3,pid4;int producer(int id);int consumer(int id);int main(int argc,char *argv) if (pipe(pipe_fd)0) printf(pipe create error.n); exit(-1); else printf(pipe is created successfully!n); if(pid1=fork()=0) producer(1); if(pid2=fork()=0) producer(2); if(pid3=fork()=0) consumer(1); if(pid4=fork()=0) consumer(2); close(pipe_fd0); close(pipe_fd1);int i,pid,status;for(i=0;i4;i+) pid=wait(&status);exit(0);int producer(int id)printf(producer %d is running!n,id); close(pipe_fd0); int i=0; for(i=1;i10;i+)sleep(3); if(id=1) strcpy(w_buf,aaa0); else strcpy(w_buf,bbb0); if(write(pipe_fd1,w_buf,4)=-1) printf(write to pipe errorn); close(pipe_fd1); printf(producer %d is over!n,id); exit(id); int consumer(int id)close(pipe_fd1);printf(consumer %d is running!n,id); if(id=1) strcpy(w_buf,ccc0); else strcpy(w_buf,ddd0);while(1) sleep(1); strcpy(r_buf,eee0); if(read(pipe_fd0,r_buf,4)=0) break; printf(consumer %d get %s,while the w_buf is %sn,id,r_buf,w_buf); close( pipe_fd0 ); printf(consumer %d is over!n,id); exit(id); #include #include #include #include #include int producer(void *args);int consumer(void *args);pthread_mutex_t mutex;sem_t product;sem_t warehouse;char buffer84;int bp=0;main(int argc,char *argv) pthread_mutex_init(&mutex,NULL); sem_init(&product,0,0); sem_init(&warehouse,0,8); int clone_flag,arg,retval; char *stack; clone_flag=CLONE_VM; int i; for(i=0;i2;i+) arg=i; stack=(char*)malloc(4096); retval=clone(void*)producer,&(stack4095),clone_flag, (void*)&arg); stack=(char*)malloc(4096); retval=clone(void*)consumer,&(stack4095),clone_flag, (void*)&arg); exit(1);int producer(void *args) int id=*(int*)args); int i; for(i=0;i10;i+) sleep(i+1); sem_wait(&warehouse); pthread_mutex_lock(&mutex); if(id=0) strcpy(bufferbp,aaa0); else strcpy(bufferbp,bbb0); bp+; printf(producer %d produce %s in %dn,id,bufferbp,bp-1); pthread_mutex_unlock(&mutex); sem_post(&product); printf(producer %d is over!n,id); int consumer(void *args) int id=*(int*)args); int i; for(i=0;i”),当主程序无任务可调度时执行,以空耗一个时间单

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论