山大操作系统实验-1

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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");}

相关文档
最新文档