实验三 Linux进程的创建与控制

合集下载

进程控制实验报告

进程控制实验报告

一、实验目的本次实验旨在通过Linux操作系统的实践操作,加深对进程控制概念的理解。

通过学习进程的创建、调度、同步、通信等基本操作,掌握进程控制的基本方法,并了解进程间通信的机制。

二、实验环境1. 硬件环境:Intel(R) Core(TM) i5-3210M CPU2.50GHz,4.00GB内存。

2. 软件环境:64位Linux操作系统。

三、实验内容1. 进程的创建与终止2. 进程的调度与优先级3. 进程同步与互斥4. 进程间通信四、实验步骤1. 进程的创建与终止(1)使用`fork()`函数创建子进程,通过比较返回值判断创建是否成功。

```cpid_t pid = fork();if (pid < 0) {perror("fork failed");exit(1);}```(2)使用`exit()`函数终止进程。

```cexit(0);```2. 进程的调度与优先级(1)使用`nice()`函数调整进程优先级。

```cnice(10); // 降低进程优先级```(2)使用`priority_seta()`函数设置进程优先级。

```cstruct sched_param param;param.sched_priority = 10;if (sched_setscheduler(pid, SCHED_RR, &param) == -1) { perror("sched_setscheduler failed");exit(1);}```3. 进程同步与互斥(1)使用`semaphore_t`类型的信号量实现进程同步。

```csemaphore_t sem;sem_init(&sem, 0, 1);sem_wait(&sem);// 执行临界区代码sem_post(&sem);sem_destroy(&sem);```(2)使用`mutex_t`类型的互斥锁实现进程互斥。

进程的创建控制-实验报告

进程的创建控制-实验报告

内蒙古师大计算机与信息工程学院《操作系统》课程实验报告操作系统原理实验实习题目进程的创建控制实验指导教师玉柱职称副教授学生姓名王雪婷学号20141105053日期16-12-7实现工具Telnet实现环境Linux通过编写一段程序,使用系统调用fork( ) 函数创建两个子进程,第一个子进程输出 brother1,第二个子进程输出brother2,父进程输出 father,实习内从而体会进程间的并发特征。

容(功能、目标)使用 c 语言进行编写,利用分叉函数生成子进程,子进程生成之后在子进程中调用 sleep( )函数,调整父进程及子进程的并发执行过程。

1. Fork()实(1)功能:创建一子进程;(2)返回值现0:从进程返回;的>0:从父进程返回,返回值为子进程的进程标识号;思想-1:创建失败返回。

、2. Exit()方法(1)功能:终止调用进程(结束进程);和(2)说明:技结束进程后,要通知父进程;术(父进程中 wait 调用读取相应信息)(含3. Wait()数(1)功能:控制父进程与子进程同步;据(2)返回值结-1:出错返回;构、n:正确返回子进程的 ID ;算0:其它。

法) 4. sleep(n)(1)功能:当前进程睡眠n 秒钟;(2)使调用进程进入睡眠队列。

主要代码注释#include<stdio.h>#include<stdlib.h>main(){int p1,p2;while((p1=fork())==-1);// 创建子进程 1if(p1==0)//如果 p1 是 0,执行子进程{ 1 中的内容printf("brother1\n");exit(0);sleep(5);}else//否则将创建子进程2{while((p2=fork())==-1);if(p2==0){printf("brother2\n");exit(0);sleep(0);}wait(0);printf("father\n");}}第一次编写完成之后运行出现了图 1 的情况(因图片放入该页面会出现文字越界现象,所以图片放在了最后一页),经过查找发现程序中使用了exit( ) 函数但是没有使用头文件 <stdlib.h> ;当添加完头文件之后,运行出现了图 2 现象,表明实验成功,但是想起老师上课时说进程上cpu 是随机的,所以测试了四组,但是结果都是一样结果3),输出依次是:brother1 father brother2 .分的(见图析(含实现中出错原因分析)指导教师评语、评分评分:指导教师:年月日图1图2图3。

操作系统实验3进程的创建控制实验

操作系统实验3进程的创建控制实验

操作系统实验3进程的创建控制实验实验三的目标是通过实现一个进程控制程序,来加深我们对进程创建和控制机制的理解,并通过实践来熟悉和掌握相关的编程技巧。

在进行实验之前,我们需要先了解进程的一些基本概念和相关知识。

首先,进程的创建是通过操作系统中的系统调用来完成的。

在Linux系统中,常用的创建进程的系统调用有fork(和exec(。

fork(系统调用可以创建一个新的进程,该进程与调用fork(的进程几乎完全相同;而exec(系统调用则在新创建的进程中执行一个新的程序。

另外,进程的控制机制主要是通过进程的状态来实现的。

进程可以处于就绪状态、运行状态和阻塞状态。

就绪状态的进程可以被调度器选择后立即运行,而阻塞状态的进程则需要等待一些条件满足后才能被唤醒并变为就绪状态。

实验三的具体内容包括:1. 编写一个程序,通过调用fork(创建多个子进程。

子进程和父进程可以并行执行,共享程序的代码和数据段。

2. 子进程通过调用exec(系统调用执行不同的程序。

可以通过调用不同的exec(函数或者传入不同的参数来执行不同的程序。

3. 子进程执行的程序可能会产生不同的结果,比如输出不同的字符串或者产生不同的返回值。

我们可以通过wait(系统调用等待子进程退出,并获取子进程的返回值。

4. 父进程可以通过调用waitpid(系统调用来选择等待一些特定的子进程,以及获取特定子进程的返回值。

通过实验三的实践,我将更加深入地了解进程的创建和控制机制。

实验三的实验结果将让我熟悉和掌握相关的编程技巧,为我今后更加熟练地编写和控制进程打下坚实的基础。

总之,实验三是一个非常有意义的实验,将帮助我更加深入地理解进程的创建和控制机制,并通过实践获得相关的编程技巧。

这将对我今后的学习和实践有很大的帮助。

Linux系统编程之进程控制(进程创建、终止、等待及替换)

Linux系统编程之进程控制(进程创建、终止、等待及替换)

Linux系统编程之进程控制(进程创建、终⽌、等待及替换)进程创建在上⼀节讲解进程概念时,我们提到fork函数是从已经存在的进程中创建⼀个新进程。

那么,系统是如何创建⼀个新进程的呢?这就需要我们更深⼊的剖析fork 函数。

1.1 fork函数的返回值调⽤fork创建进程时,原进程为⽗进程,新进程为⼦进程。

运⾏man fork后,我们可以看到如下信息:#include <unistd.h>pid_t fork(void);fork函数有两个返回值,⼦进程中返回0,⽗进程返回⼦进程pid,如果创建失败则返回-1。

实际上,当我们调⽤fork后,系统内核将会做:分配新的内存块和内核数据结构(如task_struct)给⼦进程将⽗进程的部分数据结构内容拷贝⾄⼦进程添加⼦进程到系统进程列表中fork返回,开始调度1.2 写时拷贝在创建进程的过程中,默认情况下,⽗⼦进程共享代码,但是数据是各⾃私有⼀份的。

如果⽗⼦只需要对数据进⾏读取,那么⼤多数的数据是不需要私有的。

这⾥有三点需要注意:第⼀,为什么⼦进程也会从fork之后开始执⾏?因为⽗⼦进程是共享代码的,在给⼦进程创建PCB时,⼦进程PCB中的⼤多数数据是⽗进程的拷贝,这⾥⾯就包括了程序计数器(PC)。

由于PC中的数据是即将执⾏的下⼀条指令的地址,所以当fork返回之后,⼦进程会和⽗进程⼀样,都执⾏fork之后的代码。

第⼆,创建进程时,⼦进程需要拷贝⽗进程所有的数据吗?⽗进程的数据有很多,但并不是所有的数据都要⽴马使⽤,因此并不是所有的数据都进⾏拷贝。

⼀般情况下,只有当⽗进程或者⼦进程对某些数据进⾏写操作时,操作系统才会从内存中申请内存块,将新的数据拷写⼊申请的内存块中,并且更改页表对应的页表项,这就是写时拷贝。

原理如下图所⽰:第三,为什么数据要各⾃私有?这是因为进程具有独⽴性,每个进程的运⾏不能⼲扰彼此。

1.3 fork函数的⽤法及其调⽤失败的原因fork函数的⽤法:⼀个⽗进程希望复制⾃⼰,通过条件判断,使⽗⼦进程分流同时执⾏不同的代码段。

Linux实验3报告

Linux实验3报告

仲恺农业工程学院实验报告纸(院、系)专业班Linux系统编程课学号姓名实验日期教师评定实验三进程一、实验目的掌握Linux进程创建机制、进程调度原理。

二、实验环境硬件:每个学生需配备计算机一台,操作系统:linux。

三、实验题目和实验内容实验题目:进程实验内容:1、教材174页第1题。

编程,在一个主程序中创建一个子进程,子进程输出“hello world”,然后退出。

2、教材174页第3题。

编程,在程序中使用命令行形式显示程序所在当前文件夹下的内容。

四、实验数据和实验结果(程序运行结果的截图)1、2、五、附录(程序代码)1、代码如下:#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main(){pid_t pid;int vari=5;if((pid=vfork())<0){printf("vfork error.\n");return 1;}else if(pid==0){printf("Hello world! \n");printf("Child process exited!\n");_exit(0);}printf("Parent process exited!\n");return 0;}2、代码如下:#include <stdio.h>#include <sys/types.h>#include <sys/wait.h>#include <stdlib.h>int main(){int status;if((status=system("ls"))<0){printf("system error .\n");exit(0);}return 0;}。

linux的进程管理实验总结

linux的进程管理实验总结

linux的进程管理实验总结Linux的进程管理实验总结1. 引言Linux中的进程管理是操作系统的核心功能之一,在实际的系统运行中起着重要的作用。

进程管理能够有效地分配系统资源、管理进程的运行状态和优先级,以及监控进程的行为。

本文将以Linux的进程管理实验为主题,分步骤介绍实验过程及总结。

2. 实验目的本次实验的目的是理解Linux中进程的概念,掌握进程的创建、运行和终止的基本操作,以及进程的状态转换过程。

3. 实验环境本次实验使用的是Linux操作系统,可以选择使用虚拟机安装Linux或者使用Linux主机进行实验。

4. 实验步骤4.1 进程的创建在Linux中,可以使用系统调用fork()来创建一个新的子进程。

在实验中,可以编写一个简单的C程序来调用fork()系统调用,实现进程的创建。

具体步骤如下:(1)创建一个新的C程序文件,例如"process_create.c"。

(2)在C程序文件中,包含必要的头文件,如<stdio.h>和<unistd.h>。

(3)在C程序文件中,编写main()函数,调用fork()函数进行进程的创建。

(4)编译并运行该C程序文件,观察控制台输出结果。

实验中,可以通过观察控制台输出结果,判断新的子进程是否被成功创建。

4.2 进程的运行在Linux中,通过调用系统调用exec()可以用一个新的程序替换当前进程的执行。

可以使用exec()函数来实现进程的运行。

具体步骤如下:(1)创建一个新的C程序文件,例如"process_run.c"。

(2)在C程序文件中,包含必要的头文件和函数声明,如<stdio.h>和<unistd.h>。

(3)在C程序文件中,编写main()函数,调用execl()函数来执行一个可执行程序。

(4)编译并运行该C程序文件,观察控制台输出结果。

实验中,可以通过观察控制台输出结果,判断新的程序是否被成功执行。

实验三 进程的创建和简单控制

实验三  进程的创建和简单控制

实验三进程的创建和简单控制实验目的:1. 掌握进程的概念和进程的状态,对进程有感性的认识;2. 掌握进程创建方法;3. 认识进程的并发执行,了解进程族之间各种标识及其存在的关系;4. 熟悉进程的创建、阻塞、唤醒、撤销等控制方法。

实验内容:1. 了解有关Linux进程的属性和进程的层次结构;2. 学习有关Linux的前台和后台进程;3. 学习有关Linux命令的顺序执行和并发执行;4. 学习有关挂起和终止进程;5. 了解并发程序的不可确定性,进行简单并发程序设计。

实验步骤:(一)Shell 下的进程控制1. 进入Linux系统。

2. 用ps查看进程。

a) linux的ps命令是用来监视系统进程和资源使用情况的命令,可显示瞬间进程的动态。

b) ps 的参数非常多,常用的参数有:i. -A 列出所有的进程;ii. -w 显示加宽可以显示较多的信息;iii. -au 显示较详细的信息;iv. -aux 显示所有包含其他使用者的进程。

3. 用kill终止某些进程。

a) kill命令通过向进程发送指定的信号来结束进程。

b) 先使用ps查到进程号,再使用kill杀出进程。

4. 用pstree命令显示系统中进程层次结构。

PDF 文件使用 "pdfFactory Pro" 试用版本创建a) pstree指令用ASCII字符显示树状结构,清楚地表达进程间的相互关系。

b) 语法格式pstree [-acGhlnpuUV][-H <程序识别码>][<程序识别码>/<用户名称>](二)Linux 简单进程编程1. 理解系统调用fork()的使用。

a) fork()会产生一个与父程序相同的子程序,唯一不同之处在于其进程号。

图2 系统调用fork()b) 编辑下面的程序,如图3所示,要求实现父进程产生两个子进程,父进程显示字符“a”、两个子进程,分别显示字符“b”、“c”。

LINUX进程创建实验

LINUX进程创建实验

进程创建实验报告一、实验目的1、掌握进程的概念,明确进程的含义;2、认识并了解并发执行的实质。

二、实验准备了解Linux的系统调用函数fork()的用法。

三、实验过程实验一1、编写代码如下:#include <stdio.h>int main(){int p1,p2,p3;while((p1=fork())== -1); /*创建子进程p1*/ if (p1==0)printf("b\n");else{while((p2=fork())== -1); /*创建子进程p2*/if(p2==0)printf("c\n");else{while((p3=fork())==-1); /*创建子进程p3*/if(p3==0)printf("d\n");elseprintf("a\n");}}return 0;}2、创建exe文件在终端中输入上述字符即可将fork.c文件中的程序转化为名为fork的exe文件。

3、执行exe文件将其运行多次后如下:4、结果运行的结果为‘abcd’四个字母任意排列实验二1、编写代码如下#include <stdio.h>main( ){int p1,p2,p3,i;while((p1=fork( ))== -1); /*创建子进程p1*/ if (p1==0)for(i=0;i<10;i++)printf("daughter %d\n",i);else{while((p2=fork( ))== -1); /*创建子进程p2*/ if(p2==0)for(i=0;i<10;i++)printf("son %d\n",i);else{while((p3=fork())== -1); /*创建子进程p3*/ if(p3==0)for(i=0;i<10;i++)printf("son2 %d\n",i);elsefor(i=0;i<10;i++)printf("parent %d\n",i);}}}2、exe文件创建与实验一相同3、执行exe文件4、实验结果结果也是各语句乱序混叠输出。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(i=0;i<20;i++)
printf(“child %d\n”,i);
lockf(1,0,0);/解锁/
}
else
{
while((p2=fork())= =-1);
if(p2= =0)
{
lockf(1,1,0);
for(i=0;i<20;i++)
printf(“son %d\n”,i);
lockf(1,0,0);
}
else
{
lockf(1,1,0);
for(i=0;i<20;i++)
printf(“daughter %d\n”,i);
lockf(1,0,0);
}
}
}
思考问题:
(1)系统是怎样创建进程的?
(2)当首次调用新创建进程时,其入口在哪里?
while((p1=fork())= =-1);
if(p1= =0)
for(i=0;i<20;i++)
printf(“Child %d\n”,i);
else
{
while((p2=fork() )= =-1);
if(p2= =0)
for(i=0;i<20;i++)
printf(“Son %d\n”,i)
else
for(i=0;i<20;i++)
printf(“Daughter %d\n”,i);
}
}
程序2:
#include <stdio.h>
#include <unistd.h>
main()
{
intp1,p2,I;
while((p1=fork())= =-1);
if(p1= =0)
{
lockf(1,1,0);/加锁/
1.进程的家族关系
在主程序中用3个fork()调用,最后输出一个字符或字符串,运行此简单的程序,观察并分析运行结果。
2.进程的创建
编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符“b”和字符“c”。观察纪录屏幕上的显示结果,并分析原因。
实验三Linux进程的创建与控制
一、实验目的
(1)加深对进程概念的理解,明确进程和程序的区别。
(2)进一步认识并发执行的实质。
(3)分析进程竞争资源现象,学习解决进程互斥பைடு நூலகம்方法。
(4)了解Linux系统中进程通信的基本原理。
二、实验预备内容
阅读Linux的fork.c源文件,分析进程的创建过程。
三、实验内容
fork();
fork();
printf(“S”);
}
查看运行结果并分析进程的创建和调用过程。
2.进程的创建
#include<stdio.h>
main()
{ int p1,p2;
while((p1=fork())==-1); /创建进程p1,创建成功后退出/
if(p1= =0) /CPU运行p1/
putchar(‘b’);/输出字符b/
else
{
while((p1=fork())==-1); /创建进程p2,创建成功后退出/
if(p1= =0)
putchar(‘c’);
else putchar(‘a’); /父进程执行/
}
}
观察运行结果并分析原因。
3.进程的控制
程序1:
#include<stdio.h>
main()
{
int p1,p2,i;
3. 进程的控制
修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因。
如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。
四、实验源程序(仅供参考)
1.用进程的家族关系
main()
{
fork();
相关文档
最新文档