操作系统Linux进程创建
操作系统实验04 Linux 多进程编程

《操作系统》实验报告实验序号:实验四实验项目名称:实验04 Linux 多进程编程学号1207022103 姓名陈华荣专业、班网络工程实验地点实1-311 指导教师李桂森实验时间2014.10.26一、实验目的及要求1.通过本实验的学习,使学生掌握Linux多进程编程的基本方法。
2.实验内容:利用Linux多进程实现题目所要求的功能。
3.以学生自主训练为主的开放模式组织教学二、实验设备(环境)及要求PC机三、实验内容与步骤1、编写一个显示“HELLO”的c语言程序,并利用GCC编译,然后运行此程序。
(提示:若没有gcc,需先安装gcc编译程序)指令:Apt-get install updateApt-get install gccCd /home/normaluesrTouch helloworld.cVim helloeorld.c在helloworld里编辑进:#include<stdio.h>Int main(){Printf(“helloworld”);Return 0;}然后用gcc进行编译运行:或者直接2、进程的创建:编制一程序,利用系统调用fork()创建两个子进程。
程序运行时,系统中有一个父进程和两个子进程活动,分别让他们显示“A”、“B”和“C”,分析程序运行结果。
3、用ctrl+alt+F2切换到第二个终端(tty2)并使用另外一个用户登录(可利用第二个实验创建的用户登录),然后使用who命令查看用户登录情况。
用ctrl+alt+F1切换到第二个终端(tty1),修改第二步的程序,在每个进程退出前都加上一个sleep(20)的函数来延缓进程的退出,然后运行此程序,立即切换到tty2,使用ps -a命令查看系统运行的进程,观察程序创建的进程都有哪些?pid是多少?4、进程的管道通信:编制一程序,使用系统调用pipe()建立一管道,两个子进程P1和P2分别向管道各写一句话,父进程则从管道中读取出来并显示在屏幕。
linux中对于进程的保护机制

linux中对于进程的保护机制Linux是一种广泛应用的操作系统,它采用了多进程的模型来管理系统资源和运行程序。
进程作为计算机中最小的执行单位,同时也是操作系统中最基本的抽象概念之一,因此对进程的保护机制显得尤为重要。
本文将从进程的创建、权限控制、内存隔离和异常处理等方面,介绍Linux中对进程的保护机制。
Linux中对进程的保护始于进程的创建。
在Linux系统中,进程的创建通过系统调用fork()来实现。
当一个进程调用fork()时,操作系统会为其创建一个与父进程相同的副本,包括代码段、数据段、堆栈等。
这样一来,即使子进程发生异常或错误,也不会影响到父进程的执行。
同时,Linux还提供了exec()系列函数,用于在已有进程的地址空间中加载新的程序,从而实现进程的替换。
这种机制可以防止非法程序篡改进程的内存空间,保护系统的安全性。
Linux通过权限控制机制来保护进程的执行。
每个进程都有一个属主和一组权限,用于控制对进程资源的访问。
Linux系统中,进程的权限分为用户权限和组权限,分别控制着对进程文件、信号和资源的访问。
此外,Linux还支持访问控制列表(ACL)机制,允许用户对进程资源进行更细粒度的控制。
通过这种方式,Linux能够保护进程不被未授权的用户或进程访问,提高系统的安全性。
第三,Linux通过内存隔离机制来保护进程的内存空间。
每个进程在运行时都有自己独立的内存空间,这样可以防止进程之间相互干扰和非法访问。
Linux使用虚拟内存技术,将物理内存抽象为虚拟地址空间,并通过页表将虚拟地址映射到物理地址。
这样一来,每个进程都有自己的页表,可以实现内存的隔离和保护。
此外,Linux 还提供了地址空间布局随机化(ASLR)机制,通过随机化内存地址的分配,增加了攻击者对进程内存布局的猜测难度,提高了系统的安全性。
Linux通过异常处理机制来保护进程的正常执行。
在进程执行过程中,如果发生异常或错误,操作系统会捕获并进行相应的处理。
操作系统实验3进程的创建控制实验

操作系统实验3进程的创建控制实验实验三的目标是通过实现一个进程控制程序,来加深我们对进程创建和控制机制的理解,并通过实践来熟悉和掌握相关的编程技巧。
在进行实验之前,我们需要先了解进程的一些基本概念和相关知识。
首先,进程的创建是通过操作系统中的系统调用来完成的。
在Linux系统中,常用的创建进程的系统调用有fork(和exec(。
fork(系统调用可以创建一个新的进程,该进程与调用fork(的进程几乎完全相同;而exec(系统调用则在新创建的进程中执行一个新的程序。
另外,进程的控制机制主要是通过进程的状态来实现的。
进程可以处于就绪状态、运行状态和阻塞状态。
就绪状态的进程可以被调度器选择后立即运行,而阻塞状态的进程则需要等待一些条件满足后才能被唤醒并变为就绪状态。
实验三的具体内容包括:1. 编写一个程序,通过调用fork(创建多个子进程。
子进程和父进程可以并行执行,共享程序的代码和数据段。
2. 子进程通过调用exec(系统调用执行不同的程序。
可以通过调用不同的exec(函数或者传入不同的参数来执行不同的程序。
3. 子进程执行的程序可能会产生不同的结果,比如输出不同的字符串或者产生不同的返回值。
我们可以通过wait(系统调用等待子进程退出,并获取子进程的返回值。
4. 父进程可以通过调用waitpid(系统调用来选择等待一些特定的子进程,以及获取特定子进程的返回值。
通过实验三的实践,我将更加深入地了解进程的创建和控制机制。
实验三的实验结果将让我熟悉和掌握相关的编程技巧,为我今后更加熟练地编写和控制进程打下坚实的基础。
总之,实验三是一个非常有意义的实验,将帮助我更加深入地理解进程的创建和控制机制,并通过实践获得相关的编程技巧。
这将对我今后的学习和实践有很大的帮助。
进程管理演示实验报告

一、实验目的1. 理解进程的概念及其在操作系统中的作用。
2. 掌握Linux系统中进程的创建、调度、同步和通信方法。
3. 熟悉进程的阻塞、挂起、恢复和终止操作。
4. 学习使用相关命令和工具进行进程管理和调试。
二、实验环境操作系统:Linux开发环境:GCC、Xshell三、实验内容1. 进程创建与调度2. 进程同步与通信3. 进程阻塞与恢复4. 进程终止与调试四、实验步骤1. 进程创建与调度(1)编写一个简单的C程序,使用fork()函数创建一个子进程。
(2)在父进程中,使用getpid()和getppid()函数获取进程ID和父进程ID。
(3)使用ps命令查看当前系统中的进程,观察父进程和子进程的状态。
(4)使用waitpid()函数等待子进程结束。
2. 进程同步与通信(1)编写一个使用管道(pipe)进行进程间通信的C程序。
(2)父进程向管道中写入数据,子进程从管道中读取数据。
(3)使用ps命令查看进程状态,观察管道通信的效果。
(4)编写一个使用信号量(semaphore)进行进程同步的C程序。
(5)使用sem_wait()和sem_post()函数实现进程同步。
3. 进程阻塞与恢复(1)编写一个使用sleep()函数使进程阻塞的C程序。
(2)在父进程中,使用waitpid()函数等待阻塞的子进程结束。
(3)使用kill()函数向阻塞的进程发送SIGCONT信号,使其恢复执行。
4. 进程终止与调试(1)编写一个使用exit()函数终止进程的C程序。
(2)在父进程中,使用waitpid()函数等待终止的子进程。
(3)使用gdb调试器分析程序运行过程中出现的问题。
五、实验结果与分析1. 进程创建与调度实验结果表明,使用fork()函数成功创建了子进程,父进程和子进程的进程ID和父进程ID被正确获取。
通过ps命令,可以观察到父进程和子进程的状态。
2. 进程同步与通信实验结果表明,管道通信可以成功实现父进程和子进程之间的数据传递。
linux进程管理的实验报告

实验报告:Linux进程管理1. 引言本实验报告将详细介绍Linux系统中进程管理的相关知识和操作。
进程管理是操作系统中的一个重要组成部分,它负责控制和调度系统中运行的各个进程,确保系统资源的合理分配和进程的正常运行。
在本实验中,我们将通过一系列步骤来了解Linux系统中进程的创建、监控和控制。
2. 实验环境为了完成本实验,我们需要在一台运行Linux操作系统的计算机上进行操作。
本实验报告基于Ubuntu 20.04 LTS操作系统进行撰写,但是适用于大多数Linux 发行版。
3. 实验步骤步骤一:创建新进程在Linux系统中,可以通过fork()系统调用来创建新的进程。
以下是一个简单的示例代码:#include <stdio.h>#include <unistd.h>int main() {pid_t pid = fork();if (pid == 0) {// 子进程逻辑printf("这是子进程\n");} else if (pid > 0) {// 父进程逻辑printf("这是父进程\n");} else {// 进程创建失败printf("进程创建失败\n");}return0;}步骤二:查看进程信息Linux系统提供了多种命令来查看系统中运行的进程信息。
以下是一些常用的命令:•ps:显示当前终端下的进程列表。
•top:实时显示进程的CPU、内存等资源占用情况。
•pstree:以树状结构显示进程的层次关系。
步骤三:杀死进程有时候我们需要终止一个运行中的进程,可以使用kill命令来发送终止信号给目标进程。
以下是一个示例:kill <PID>请将<PID>替换为目标进程的进程ID。
步骤四:进程优先级调整通过调整进程的优先级,可以影响进程在系统中的调度顺序。
在Linux系统中,可以使用nice命令来调整进程的优先级。
操作系统-进程管理实验报告

操作系统-进程管理实验报告实验一进程管理1.实验目的:(1)加深对进程概念的理解,明确进程和程序的区别;(2)进一步认识并发执行的实质;(3)分析进程争用资源的现象,研究解决进程互斥的方法;(4)了解Linux系统中进程通信的基本原理。
2.实验预备内容(1)阅读Linux的sched.h源码文件,加深对进程管理概念的理解;(2)阅读Linux的fork()源码文件,分析进程的创建过程。
3.实验内容(1)进程的创建:编写一段程序,使用系统调用fork()创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符“b”和“c”。
试观察记录屏幕上的显示结果,并分析原因。
源代码如下:#include<XXX>#include<XXX>#include<unistd.h>#include <XXX>#include <XXX>int main(int argc,char* argv[]){pid_t pid1,pid2;pid1 = fork();if(pid1<0){fprintf(stderr,"childprocess1 failed");exit(-1);}else if(pid1 == 0){printf("b\n");}else{pid2 = fork();if(pid2<0){fprintf(stderr,"childprocess1 failed"); exit(-1);}else if(pid2 == 0){printf("c\n");}else{printf("a\n");sleep(2);exit(0);}}return 0;}结果如下:分析原因:pid=fork();操纵体系创建一个新的历程(子历程),而且在历程表中相应为它建立一个新的表项。
Linux操作系统实验实验报告

实验1:安装Linux系统【实验目的和要求】:安装Linux系统,掌握操作系统的系统配置,建立应用环境的过程。
【实验内容】:1、首先在windows系统中安装虚拟机。
在网上找到VMwareWorksttionPro版本,确定安装目录。
一直下一步,不需要太多的说明。
2、图为安装完成后的界面。
3、然后在阿里巴巴开源镜像网站下载centos系统镜像,然后虚拟机创建新的虚拟机,进行一些简单的虚拟机设置,设置了网络链接nat模式等等。
安装完成后的界面实验2:Linux下c语言开发【实验目的】:学会和掌握用c语言开发一个应用程序的全过程,包括,编译,调试等等。
【实验步骤】:首先在系统中查看是否已经安装有gcc,输入查看命令发现没有,于是需要安装gcc。
在centos系统中可以使用比较简便的yum命令。
在之前已经配置好了yum源。
直接输入yuminstallgcc。
回车自动安装程序和需要的依赖包。
因为虚拟机中和电脑很多地方切换使用不方便,所以安装了xshell软件。
图为xshell中的截图。
安装完毕。
然后使用vi或者vim编写hello.c运行,在屏幕上打印出hello,world。
实验3:进程创建【实验目的和要求】1.了解进程的概念及意义;2.了解子进程和父进程3.掌握创建进程的方法。
【实验内容】1.子进程和父进程的创建;2.编写附件中的程序实例【实验步骤】一1、打开终端,输入命令gedit1_fork.c,在1_fork.c文件中输入1_fork.bmp中的代码;2、输入命令gcc1_fork.c-o1_fork,回车后显示无错误;3、输入命令:./1_fork运行程序。
二、1、打开终端,输入命令gedit2_vfork.c,在2_vfork.c文件中输入2_vfork.bmp中的代码;2、输入命令gcc2_vfork.c-o2_vfork,回车后显示无错误:3、输入命令:./2_vfork运行程序。
从上面可以看到两次的运行结果不一样。
操作系统第二次实验报告——Linux创建进程及可执行文件结构分析

操作系统第⼆次实验报告——Linux创建进程及可执⾏⽂件结构分析0 个⼈信息张樱姿201821121038计算18121 实验⽬的熟练Linux创建进程fork操作。
2 实验内容在服务器上⽤VIM编写⼀个程序:⼀个进程创建两个⼦进程。
查看进程树查看进程相关信息3 实验报告 3.1编写程序创建两个⼦进程1 #include<sys/types.h>2 #include<stdio.h>3 #include<unistd.h>45int main(){6 pid_t cpid1 = fork(); //创建⼦进程178if(cpid1<0){9 printf("fork cd1 failed\n");10 }11else if(cpid1==0){12 printf("Child1:pid: %d, ppid: %d\n",getpid(),getppid());13 }14else{15 pid_t cpid2 = fork(); //创建⼦进程216if(cpid2<0){17 printf("fork cd2 failed\n");18 }19else if(cpid2==0){20 printf("Child2:pid: %d, ppid: %d\n",getpid(),getppid());21 }22else{23 printf("Parent: pid :%d\n",getpid());24 }25 }26 }编译运⾏后的结果:3.2打印进程树 添加sleep函数以挂起进程,⽅便打印进程树:1 #include<sys/types.h>2 #include<stdio.h>3 #include<unistd.h>45int main(){6 pid_t cpid1 = fork();78if(cpid1<0){9 printf("fork cd1 failed\n");10 }11else if(cpid1==0){12 printf("Child1:pid: %d, ppid: %d\n",getpid(),getppid());13 sleep(30); //挂起30秒14 }15else{16 pid_t cpid2 = fork();17if(cpid2<0){18 printf("fork cd2 failed\n");19 }20else if(cpid2==0){21 printf("Child2:pid: %d, ppid: %d\n",getpid(),getppid());22 sleep(30); //挂起30秒23 }24else{25 printf("Parent: pid :%d\n",getpid());26 sleep(60); //挂起60秒27 }28 }29 }pstree -p pid #打印进程树 3.3 解读进程相关信息 3.3.1 解释执⾏ps -ef后返回结果中每个字段的含义 ps -ef输出格式 :UID PID PPID C STIME TTY TIME CMDUID: User ID,⽤户ID。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
查询进程树。
3、运行程序,分析运行结果。 #include <stdio.h> main() { int p,x,ppid,pid;
x=0; p=fork(); if(p>0) { printf("parent output x=%d\n",++x);
ppid=getpid(); printf("Thi id number of parent is:ppid=%d\n",ppid); } else { printf("child output x=%d\n",++x); pid=getpid(); printf("Thi id number of child is:pid=%d\n",pid); } } 运行结果: Parent output x=1 This id number of parent is:ppid=3110 Child output x =1 This is number of child is:pid=3111
分析:fork 创建进程的时候子进程与父进程共享代码区,子进程复制父进程的数据区,所以, 两个进程中的数据互不影响都是 1。
4、loop.c #include <stdio.h> main() {
while(1){ }; { 实验步骤: 编译 gcc loop.c –o loop 后台运行 ./loop &(可多次使用该命令) 多次使用 ps 命令查看进程状态 结果: F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 2645 2643 0 80 0 - 1444 wait pts/0 00:00:00 bash 0 R 1000 3622 2645 78 80 0 - 403 - pts/0 00:00:18 loop 0 R 1000 3627 2645 39 80 0 - 403 - pts/0 00:00:02 loop 0 R 1000 3628 2645 39 80 0 - 403 - pts/0 00:00:01 loop 0 R 1000 3630 2645 0 80 0 - 625 - pts/0 00:00:00 ps
获得处理机执行,此进程很快执行完,将处理机还给子进程,子进程也很快执行
完,将处理机还给父进程,父进程 P>0 执行 if 语句,运行 fork()函数,又创建
一个进程 forktree,称之为第二子进程,此进程获得处理机执行很快运行完,
将处理机还给父进程,父进程运行 sleep(15)语句,休眠 15 秒,用 pstree 命令
进程的创建
1、编写一段程序,使用系统调用 fork( )创建两个子进程。当此程序运行时,在系统中 有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符。 #include<stdio.h> main() {
int p,x; p=fork(); if(p>0) {
x=fork(); if(x>0)
ree───forktree
│
│
│
│
└─forktree
│
│
│
ቤተ መጻሕፍቲ ባይዱ
└─forktree
│
│
└─pstree
分析:程序运行,系统首先创建一个进程 forktree,执行到 p=fork()创建一个子
进程 forktree,子进程获得处理机优先执行,父进程等待;执行 else,当执行
到第一个 fork()函数时,子进程创建了一个进程 forktree,称之为孙进程,孙
进程获得处理机往下执行,子进程等待;执行到第二个 fork()函数时,孙进程
又创建一个进程 forktree,称之为重孙进程,重孙进程很快执行完,将处理机
还给孙进程,孙进程很快执行完,将处理机还给子进程;子进程继续往下执行,
执行到第二个 fork()函数,又创建一个进程 forktree,称之为第二孙进程,并
fork(); else{
fork(); fork(); } sleep(15); }
实验步骤: 编译连接 gcc –o forktree forktree.c 后台运行 ./forktree & 使用 pstree –h 查看进程树
运行结果:
├─gnome-terminal─┬─bash─┬─forktree─┬─forktree─┬─forkt
printf("father\n"); else
printf("child2"); } else
printf("child1"); } 输出结果: child1 child2 father
2、运行以下程序,分析程序执行过程中产生的进程情况。 #include <stdio.h> main() {
int p,x; p=fork(); if (p>0)