山大操作系统实验-1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统原理实验报告——实验一
张咪软件工程四班
一、实验目的
加深对于进程并发执行概念的理解。实践并发进/线程
的创建和控制方法。观察和体验进程的动态特性。进
一步理解进程生命期期间创建、变换、撤销状态变换
的过程。掌握进程控制的方法,了解父子进程间的控
制和协作关系。练习Linux系统中进/线程创建与控制
有关的系统调用的编程和调试技术。
二、实验要求
编写一个多进程并发执行程序。父进程每隔3秒重复建立两个子进程,首先创建的让其执行ls命令,之后创建执行让其执行ps命令,并控制ps命令总在ls命令之前执行。
三、实验软硬件环境
实验环境均为Linux操作系统,开发工具为gcc和g++。
四、实验思路
调用fock()创建子进程。创建键盘中断信号后,使用pause()可以暂停子进程执行,继续创建新的子进程。子进程并发执行子进程可以首先通过键盘中断信号唤醒子进程。通过exec()调用族装入一个新的执行程序。在建立子进程2并且唤醒子进程1后子进程sleep(seconds = 5)。这样就可以先执行ps后执行ls。。最后就是父进程的结束,程序结束。
五、实验模型
六、调试排错
1、首先遇到的问题是,对linux的操作不熟悉,不太明白makefile怎么使用,直接用了gcc
2、在创建多个子进程上遇到了问题,在fock()后又直接跟了一个fork(),这样创建的子进程是子进程的子进程,而不是父进程创建的第二个子进程。所以应该在else语句块后面,也就是主进程执行段继续创建。一般情况下,fork()按如下规则编程:
main()
{ pid_t pid;
pid=fork();
if(pid<0) { // 建立子进程失败
{ printf("Create Process fail!\n");
exit(EXIT_FAILURE); }
if (pid = = 0)
//子进程代码;
//如果需要创建子进程,可以按该方法嵌套
else
//父进程代码
//如果需要创建子进程,可以按该方法嵌套
}
3、后来父进程与子进程无法重复建立,执行一次就结束了,又加了一个while循环实现重复建立,但无法退出,一直执行。又加了一个count计数变量,执行五次后停止。
七、实验结果
父进程首先创建了子进程a,子进程1暂停。父进程继续创建子进程b。子进程b唤醒了子进程a,子进程a进入sleep()。子进程2执行ps退出,子进程1执行ls。循环五次退出。
八、代码
#include"pro.h"
int main(int argc,char *argv[])
{
int i;
int pid1,pid2;
int status1,status2;
char *args1[]={"/bin/ls","-a",NULL};
char *args2[]={"/bin/ps","-a",NULL};
signal(SIGINT,(sighandler_t)sigcat);
int count=0;
while(count<5){
if((pid1=fork())==0){
pause();
printf("%d This is child1 running\n",getpid());
status1=execve(args1[0],args1,NULL);
}
else{
pid2=fork();
if(pid2<0){
printf("Create process pid2 fail\n");
exit(EXIT_FAILURE);
}
else if(pid2==0){
printf("%d This is child2 running\n",getpid());
status2=execve(args2[0],args2,NULL);
}
else{
printf("%dFather:This is father running \n",getpid());
if(kill(pid2,SIGINT)>=0){
waitpid(pid2,&status2,0);
sleep(3);
printf("%d Father: Child2 finnished\n",getpid());
count++;
if(kill(pid1,SIGINT)>=0){
waitpid(pid1,&status1,0);
printf("%d Father: Child1 finished.\n",getpid());
}
}
}
}
}return (EXIT_SUCCESS);
}
#include
#include
#include
#include
#include
#include
typedef void(*sighandler_t)(int);
void sigcat(){printf("Process continue\n");}