版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程编号:B080103040Linux 操作系统实验报告东北大学学院姓名王格格学号20134700班级1303指导教师石 凯实 验 名 称Linux 操作系统实验开 设学 期2 0 1 4 - 201 5 第 一 学 期开 设时 间第 11 周 第 1 8 周报 告 日 期2015.12.31评 定成 绩评定人石 凯评定日期(一)进程创建实验一、实验内容1进程的创建(必做题)编写一段程序,使用系统调用 fork( )创建两个子进程,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符; 父进程显示字符“a”,子进程分别显示字符“b” 和“c”。试观察屏幕上的显示结果,并分析&
2、lt;参考程序># include<stdio.h> main() intp1, p2; while(p1=fork()= if(p1= =0)putchar(b); else。=-1);/*在子进程 1 中*/*在父进程中*/=-1);while(p2=fork()= if(p2= =0)putchar(c); else/*在子进程 2 中*/*在父进程中*/putchar(a);运行结果:分析:2 修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行时屏幕上出现的现象,并分析其<参考程序># include<stdio.h> ma
3、in() intp1, p2, i; while(p1=fork()= = -1);if(p1= =0) for(i=0;i<500;i+)printf(“daughter %dn”,i);else while(p2=fork()= =-1);If(p2= =0)for(i=0;i<500;i+) printf(“son%dn”,i);elsefor(i=0;i<500;i+) printf(“parents%dn”,i);实验结果:。(必做题)由于 500 太大无法截取全部的结果,所以将循环数字替换为 4 以便截取到所有结果。分析:二、思考题1系统是怎样创建进程的?Linu
4、x 系统创建进程都是用 fork() 系统调用创建子进程由 fork()系统调用创建的新进程被称为子进程。该函数被调用一次,但返回两次。如果 fork()进程调用,两次返回的区别是子进程的返回值是 0,而父进程的返回值则是新子进程的进程号。2当前运行的程序(主进程)的父进程是什么?当前运行的程序(主进程)的父进程是 fork()出这个进程的进程,在 UNIX 系统中,只有 0 进程是在系统引导时被创建的,在系统时由0 进程创建 1 进程,以后 0 进程变成对换进程,1 进程成为系统中的始祖进程。三、实验总结通过本次实验,了解了进程的概念,知道了进程和程序的区别。简单的讲程序是一个包含可执行代码
5、的文件,是静态的。而进程是一个开始执行但还没有结束的例,就是可执行文件的具体实现。一个程序可以有多个进程,而每一个进程有可以有许多的子进程,以此类推可以产生很多的进程。当程序被系统调用到内存以后,系统会给程序分配一定的资源,然后进行一系列的浮躁操作,使程序变成进程以供系统调用。在系统里面只有进程没有程序。(二)信号量机制实验一、实验内容1编写一段程序,使用系统调用 fork( )创建两个子进程,再用系统调用 signal( )让父进程捕捉键盘上来的中断信号(即按 ctrl+c 键),当捕捉到中断信号后,父进程用系统调用 kill( )向两个子进程发出信号,子进程捕捉到父进程发来的信号后,分别输
6、出下列Child process 1 is killed by parent! Child process 2 is killed by parent!后终止:父进程等待两个子进程终止后,输出以下Parent process is killed!<参考程序>后终止:# # #include<stdio.h> include<signal.h> include<unistd.h>#include<sys/types.h> #include<sys/wait.h> int wait_mark;void waiting(),st
7、op(); void main() intp1, p2; signal(SIGINT,stop); while(p1=fork()=-1); if(p1>0) /*在父进程中*/while(p2=fork()=If(p2>0) =-1);/*在父进程中*/wait_mark=1; waiting(0); kill(p1,10);kill(p2,12);wait( );wait( ); printf(“parent exit(0);process is killed!n”);elsewait_mark=1; signal(12,stop); waiting(); lockf(1,1,
8、0);/*在子进程 2 中*/printf(“child process lockf(1,0,0);exit(0);elsewait_mark=1; signal(10,stop);waiting(); lockf(1,1,0); printf(“child lockf(1,0,0); exit(0);void waiting()2 is killed by parent!n”);/*在子进程 1 中*/process1iskilledbyparent!n”);while(wait_mark!=0);void stop()wait_mark=0;实验代码:# # #include<std
9、io.h> include<signal.h> include<unistd.h>#include<sys/types.h> #include<sys/wait.h> int wait_mark;void waiting(),stop(); int main()intp1, p2; signal(SIGINT,stop); while(p1=fork()=-1); if(p1>0)while(p2=fork()=-1); if(p2>0)wait_mark=1; waiting(0);/*在父进程中*/*在父进程中*/kill(
10、p1,10);kill(p2,12);wait(0);wait(0);printf("parent process is killed!n"); exit(0);else/*在子进程 2 中*/wait_mark=1; signal(12,stop); waiting(); lockf(1,1,0);printf("child process 2 is killed byparent!n");lockf(1,0,0); exit(0);elsewait_mark=1; signal(10,stop);waiting(); lockf(1,1,0); pr
11、intf("child processparent!n");lockf(1,0,0); exit(0);return 0;void waiting()while(wait_mark!=0);void stop()wait_mark=0;实验结果:/*在子进程 1 中*/1 is killed by思考题:(1)如果把 signal(SIGINT,stop)放在号和号位置,结果会怎样并分析。因为在 fork 子进程 1 后,子进程 1 中没有设置对 SIGINT 信号的处理,当按下 CTRL+C 后,进程 1 默认为终止,所以没有输出.(2)该程序段前面部分用了两个 wait
12、(0),为什么?父进程通过两个 wait(null);检测子进程的状态,当子进程1,2 都终止后,父进程也终止,输出“parentsprocessiskilled”(3)该程序段中每个进程用了语句 exit(0),为什么?每个进程用了语句 exit(0),一方面要结束进程,另外向父进程返回结束标志 0。2修改上面的程序,增加语句 signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),再观察程序执行时屏幕上出现的现象,并分析其。<参考程序># # #include<stdio.h> include<signal.h>
13、 include<unistd.h>intpid1, pid2; intEndFlag=0; pf1=0;pf2=0;void IntDelete()kill(pid1,10); kill(pid2,12);EndFlag=1;void Int1()printf(“child exit(0);void Int2()printf(“child exit(0);main()process1 is killed by parent !n”);process2 is killed by parent !n”);int exitcode; signal(SIGINT,SIG_IGN); si
14、gnal(SIGQUIT,SIG_IGN);while(pid1=fork()=-1); if(pid1=0)signal(SIGUSR1,Int1); signal(SIGINT,SIG_IGN); pause();exit(0);elsewhile(pid2=fork()= =-1);if(pid2=0)signal(SIGUSR2,Int2); signal(SIGINT,SIG_IGN);pause();exit(0);elsesignal(SIGINT,IntDelete); waitpid(-1,&exitcode,0);何子进程中断或结束*/printf(“parent
15、process is exit(0);实验代码:/*等待任killed n”);# # #include<stdio.h> include<signal.h> include<unistd.h>int int int intpid1, pid2; EndFlag=0; pf1=0; pf2=0;void IntDelete()kill(pid1,10); kill(pid2,12);EndFlag=1;void Int1()printf("child process 1 is exit(0);void Int2()printf("chil
16、d process 2 is exit(0);int main()int exitcode; signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN);while(pid1=fork()= -1); if(pid1=0)signal(SIGUSR1,Int1); signal(SIGINT,SIG_IGN); pause();exit(0);elsekilledbyparent!n");killedbyparent!n");while(pid2=fork()= -1); if(pid2=0)signal(SIGUSR2,Int2); s
17、ignal(SIGINT,SIG_IGN); pause();exit(0);elsesignal(SIGINT,IntDelete); waitpid(-1,&exitcode,0);或结束*/printf("parent process is exit(0);return 0;实验结果:/*等待任何子进程中断killed n");结果分析:因为忽略了中断与信号,所以一直保持阻塞状态而无法。司机售票员问题(选做题)编程用 fork()创建一个子进程代表售票员,司机在父进程中,再用系统调用 signal()让父进程(司机)捕捉来自子进程(售票员)发出的中断信号,让子
18、进程(售票员)捕捉来自(司机)发出的中断信号,以实现进程间的同步运行。售货员捕捉 SIGINT(代表开车),发 SIGUSR1 给司机,司机打印:letusgogogo售票员捕捉 SIFQUIT(代表开车),发 SIGUSR2 给司机,司机打印:stopthebus司机捕捉 SIGTSTP(代表车到总站),发 SIGUSR1 给售票员,售票员打印:pleaseget实验代码:offthebus#include<stdio.h> #include<stdlib.h> #include<sys/wait.h> #include<signal.h> #
19、include<unistd.h> intpid1,pid2;voidInit1()puts("letusgogogo");voidInit2() puts("stopthebus");voidInit3() puts("pleasegetoffthebus");voidInit4()kill(pid1,10);voidInit5()intk=getppid(); kill(k,10);voidInit6()intj=getppid(); kill(j,12);intmain(void) signal(SIGINT,SIG
20、_IGN); signal(SIGQUIT,SIG_IGN); signal(SIGTSTP,SIG_IGN);pid1=fork(); if(pid1>0)/父进程signal(10,Init1); signal(12,Init2); signal(SIGTSTP,Init4); while(1);exit(0);elseif(pid1=0) signal(SIGINT,Init5); signal(SIGQUIT,Init6); signal(10,Init3); while(1);exit(0);elseputs("wrong");returnEXIT_SUCC
21、ESS;实验结果:二、实验总结通过本次实验,我了解了关于信号的一些知识,明白了进程在运行时, 需要通过信号机制来检测是否有信号到达。如果有则终端正在执行的程序,去处理和信号对应的处理程序,完成对该的处理,处理结束后再返回,从之前中断的位置开始继续执行之前的程序。(三)进程的管道通信实验一、实验内容1编制一段现进程的管道通信。使用 pipe()建立一条管道线。两个子进程 p1 和 p2 分别向管道各写一句话:Child 1 is sending message! Child 2 is sending message!而父进程则从管道中读出来自于两个子进程的<参考程序>,显示在屏幕上。
22、# # #include<unistd.h> include<signal.h> include<stdio.h>int pid1,pid2; main()int fd2;char OutPipe100,InPipe100; pipe(fd);while(pid1=fork()= = -1);if(pid1= =0)lockf(fd1,1,0); sprintf(OutPipe,“child 1 processwrite(fd1,OutPipe,50); sleep(5);lockf(fd1,0,0); exit(0);elsewhile(pid2=fork
23、()= = -1);if(pid2= =0)lockf(fd1,1,0);is sending message!”);sprintf(OutPipe,“child 2 process is sending message!”); write(fd1,OutPipe,50);sleep(5); lockf(fd1,0,0);exit(0);elsewait(0);(fd0,InPipe,50);printf(“%sn”,InPipe);wait(0);(fd0,InPipe,50); printf(“%sn”,InPipe); exit(0);实验结果:分析结果:延迟五秒显示 child 1 p
24、rocess is sendingmessage!再延迟五秒显示 child 2 process is sending message!2在父进程中用 pipe()建立一条管道线,往管道里写一句话,两个子进程接收这句话。实验代码:#include #include #include #include<unistd.h><stdio.h><stdlib.h><sys/types.h>int main()int n;int fd2;pid_t pid1,pid2; char buffer512; if(pipe(fd)<0)printf(&qu
25、ot;cannot pipe!n"); exit(1);if(pid1 = fork()<0) printf("cannot fork"); exit(1);else if(pid1 > 0) if(pid2 = fork()<0)printf("cannot fork");exit(1);else if(pid2 >0)(fd0);write(fd1,"Hello World!",12);else(fd1);n =(fd0,buffer,6);write(STDOUT_FILENO,"n
26、p1 get n",8); write(STDOUT_FILENO,buffer,n);else(fd1);(fd0,buffer,6);n =write(STDOUT_FILENO,"n p0 get n",8); write(STDOUT_FILENO,buffer,n);eixt(0);return0;实验结果:设计和思路:二、实验总结通过本次实验,我知道了什么是管道,明白了管道是 UNIX 的一个特色。管道就是能够连接一个写程序和读程序的,并他们以生产者消费者的方式进行通信的一个共享文件又称 pipe 文件。(四)消息的发送与接收实验一、实验内容1消息的创
27、建、发送和接收。使用系统调用msgget( ),msgsnd( ),msgrev( ),及 msgctl( )编制一长度为k 的消息发送和接收的程序。<参考程序> #include #include #include.c<sys/types.h><sys/msg.h><sys/ipc.h>#define MSGKEY 75structmsgformlongmtype;charmtext1000;msg;intmsgqid;voidint()i;msgqid=msgget(MSGKEY,0777); for(i=10;i>=1;i-)msg.
28、mtype=i;/*打开 75#消息队列*/printf(“()sentn”);msgsnd(msgqid,&msg,1024,0);exit(0);/*发送消息*/main( )( );server.c#include #include #include<sys/types.h><sys/msg.h><sys/ipc.h>#define MSGKEY 75 structmsgformlongmtype;charmtext1000;msg;intmsgqid;void server( )msgqid=msgget(MSGKEY,0777|IPC_CR
29、EAT);队列*/ do/*创建 75#消息msgrcv(msgqid,&msg,1030,0,0);/*接收消息*/printf(“(server)receivedn”);while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0); exit(0);/*删除消息队列,归还资源*/main( )server( );实验结果:设计思路及:2 在父进程中创建一个消息队列,用 fork 创建一个子进程,在子进程中将一条消息传送至消息队列,父进程接受队列的消息,并将消息送屏幕显示。实验代码:#include #include #include #include
30、#include #include #include #include<stdio.h><stdlib.h><fcntl.h><string.h><unistd.h><sys/types.h><sys/ipc.h><sys/msg.h>#define MAX_TEXT 512 struct msg_stint my_msg_type; char msg_text512;/消息队列的结构体;int main(int argc,char *argv) pid_t pid;int i = 1; int status;if( (pid = fork() = -1) perror("fork"); exit(EXIT_FAILURE);else if ( pid = 0) struct msg_st some_data; int msgid;char bufferBUFSIZ;/子进程if(msgid = msgget(key_t)12345,0666|IPC_CREAT) =-1)perror("msgget"); exit(EXIT_FAIL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026河南驻马店明德高级中学招聘学科教师19人笔试备考题库及答案解析
- 2026年湖南中医药大学第二附属医院招聘22人笔试备考试题及答案解析
- 内江市第一人民医院2026年春季人才招聘计划(20人)笔试备考试题及答案解析
- 2026年阿克苏地区法检两院招聘聘用制书记员(50人)笔试备考题库及答案解析
- 2026年河南地矿职业学院单招职业技能考试题库有答案详解
- 2026上半年四川成都市崇州市事业单位考核招聘高层次人才10人笔试备考试题及答案解析
- 2026甘肃天水中山精神康复医院招聘笔试备考试题及答案解析
- 2026江西恒邦财产保险股份有限公司客服热线座席岗招聘5人笔试备考题库及答案解析
- 2026广西北海市银海区社会治理网格化指挥中心招聘编外用工人员2人笔试备考试题及答案解析
- 2026广州医科大学附属第三医院粤西医院(茂名市电白区妇幼保健院)托育园招聘编外工作人员4人笔试模拟试题及答案解析
- 《竞选三好学生》课件
- 近三年内未发生重大事故的安全生产承诺范本
- 岳阳职业技术学院单招职业技能测试参考试题库(含答案)
- 量子密码学与后量子密码学
- 部编版四年级下册语文写字表生字加拼音组词
- 威斯特年产10000吨纳米铜盐系列产品、6000吨叔丁基过氧化氢精馏及3000吨糊状过氧化二苯甲酰项目环境影响报告
- 广西-黄邵华-向量的数量积
- 1.2 国内外网络空间安全发展战略
- 2023年湖南省长沙县初中学生学科核心素养竞赛物理试题(含答案)
- 东北大学最优化方法全部课件
- 人教新课标六年级数学下册全册大单元教学设计(表格式)
评论
0/150
提交评论