实验一进程创建 Linux实验报告

合集下载

linux实验报告

linux实验报告

linux实验报告实验目的:通过对Linux操作系统的实践,掌握基本的Linux命令和操作方法,了解Linux操作系统的特点和优势。

实验一:Linux环境搭建在实验一中,我们首先需要搭建Linux操作系统的环境。

根据实验指导书的要求,我们选择了Ubuntu作为实验平台。

通过下载Ubuntu镜像文件,并利用虚拟机软件创建一个虚拟机,将镜像文件安装到虚拟机中。

在安装过程中,我们需要选择合适的分区和网络配置等,并设置root用户的密码。

实验二:基本命令的使用在实验二中,我们主要学习了Linux的基本命令的使用方法。

首先,我们了解了Linux文件系统的结构,包括根目录、用户目录、系统目录等。

然后,通过命令行终端进行一系列的实践操作,比如查看文件内容、创建目录、复制文件等。

这些命令的使用不仅提高了我们的工作效率,同时也增强了对Linux操作系统的理解。

实验三:软件安装与卸载实验三主要涉及到Linux的软件安装与卸载。

我们首先学习了使用APT工具进行软件包管理,通过安装命令行界面的方式安装了一些常用的软件,比如文本编辑器、终端工具等。

此外,我们还学习了如何卸载已安装的软件包,清理不需要的文件,以保持系统的整洁性。

实验四:权限管理在实验四中,我们学习了Linux的权限管理机制。

Linux操作系统采用了基于用户和组的权限模型,通过设置文件和目录的权限,实现对文件的读、写、执行的控制。

我们通过实际操作,创建了新的用户和组,并为不同的用户和组设置了不同的权限。

这样,可以有效地保护系统的文件和数据的安全性。

实验五:网络配置与服务搭建在实验五中,我们主要学习了Linux的网络配置和服务搭建。

通过设置网络接口、IP地址和网关等参数,实现了网络的正常连接。

同时,我们还学习了一些常用的网络命令,比如ping、ssh等。

此外,我们尝试搭建了一个简单的Web服务器,通过浏览器访问,可以查看服务器上的网页。

实验六:系统监控和故障恢复在实验六中,我们学习了Linux的系统监控和故障恢复方法。

实验报告linux编程

实验报告linux编程

实验报告linux编程实验报告:Linux编程引言:Linux操作系统是一种开源的操作系统,具有高度的灵活性和可定制性。

在本次实验中,我们将探索Linux编程的基本概念和技术。

通过编写简单的程序,我们将了解Linux系统的工作原理以及如何利用其强大的功能来开发应用程序。

一、Linux操作系统简介Linux操作系统是一种基于Unix的开源操作系统,它由许多不同的组件组成,包括内核、命令行工具和图形界面等。

Linux操作系统具有许多优势,如稳定性、安全性和可扩展性。

它广泛用于服务器、嵌入式设备和个人电脑等领域。

二、Linux编程环境搭建1. 安装Linux操作系统:选择适合自己的Linux发行版,如Ubuntu、Fedora等,并按照官方指南进行安装。

2. 安装开发工具:在Linux系统上进行编程需要安装一些开发工具,如GCC编译器、GNU调试器(GDB)等。

三、Linux编程基础1. Shell脚本编程:Shell是Linux系统的命令行解释器,通过编写Shell脚本可以实现自动化任务和批处理任务。

Shell脚本使用一些特定的语法和命令来执行任务。

2. C语言编程:C语言是Linux系统中最常用的编程语言之一,通过编写C程序可以实现更高级的功能。

C语言提供了丰富的库函数和系统调用,可以与Linux系统进行交互。

四、Linux系统编程1. 进程管理:Linux系统是一个多进程的操作系统,通过编写程序可以创建、管理和控制进程。

可以使用fork()和exec()等系统调用来创建新进程,使用wait()和kill()等系统调用来管理进程。

2. 文件操作:Linux系统中的文件操作是非常重要的一部分,通过编写程序可以实现文件的读取、写入和修改等功能。

可以使用open()、read()和write()等系统调用来进行文件操作。

3. 网络编程:Linux系统支持网络编程,通过编写程序可以实现网络通信的功能。

可以使用socket()和bind()等系统调用来创建和管理网络套接字。

进程创建实验报告

进程创建实验报告

进程创建实验报告进程创建实验报告引言:进程是计算机系统中的基本概念之一,也是操作系统的核心概念之一。

进程创建是操作系统中的一个重要操作,它涉及到资源的分配和管理,对于操作系统的正常运行具有重要意义。

本实验旨在通过编写一个简单的程序,探索进程创建的过程以及相关概念。

一、实验目的本实验的主要目的是了解进程创建的基本过程,并掌握相关的概念和操作。

通过实践,加深对操作系统的理解和应用。

二、实验环境本实验使用的是Linux操作系统,具体的版本为Ubuntu 20.04 LTS。

在该环境下,我们可以使用C语言编写程序,并通过gcc编译器进行编译和运行。

三、实验步骤1. 编写源代码首先,我们需要编写一个简单的C语言程序,用于创建一个新的进程。

在程序中,我们可以使用fork()函数来创建新的进程。

具体的代码如下:```c#include <stdio.h>#include <unistd.h>int main() {pid_t pid;pid = fork();if (pid < 0) {printf("Failed to create a new process.\n");} else if (pid == 0) {printf("This is the child process.\n");} else {printf("This is the parent process.\n");}return 0;}```2. 编译和运行程序在终端中,使用gcc编译器将源代码编译为可执行文件。

具体的命令如下:```shellgcc -o process_create process_create.c```编译成功后,我们可以通过运行可执行文件来创建新的进程。

具体的命令如下:```shell./process_create```3. 观察输出结果运行程序后,我们可以观察到输出结果。

linux下进程编程实验报告

linux下进程编程实验报告

一、用户标识(UID)和有效用户标识(EUID)使用getuid函数和geteuid函数来获取当前进程的用户标识和有效用户标识#include<stdio.h>#include<sys/types.h>#include<unistd.h>int main(void){printf("Current process UID:%ld\n",(long)getuid());printf("Current process EUID:%ld\n",(long)geteuid());return 0;}bc用户运行结果:[bc@BC test]$ ./jincheng1Current process UID:500Current process EUID:500root超级用户运行结果:[root@BC test]# ./jincheng1Current process UID:0Current process EUID:0二、fork函数通过fork函数并判断函数返回值,根据返回值来判断是在父进程还是子进程。

#include<stdio.h>#include<unistd.h>#include<sys/types.h>int main(void){pid_t pid;if((pid=fork())<0){ printf("Cannot create the new process\n");return 1;}else if(pid==0){printf("In the child process!\n");return 0;}else{printf("In the parent process!\n");return 0;}}运行结果:[root@BC test]# ./jc_forkIn the child process!In the parent process!调用fork函数后,其后代码会被父子进程分别执行。

linux进程管理的实验报告

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命令来调整进程的优先级。

Linux进程创建实验

Linux进程创建实验

Linux进程创建实验目的1.了解有关Linux系统调用;2.学习有关Linux的进程创建,理解进程创建后两个并发进程的执行。

实验内容在Linux环境下,用c语言编程,使用系统调用fork创建进程一个子进程。

观察其运行的结果。

实验提示:LINUX系统调用1. 进程控制的系统调用l fork系统调用创建新的子进程格式:pid=int fork()fork调用返回时,系统中已有两个用户级环境完全相同的进程存在,这两个进程从fork调用中得到的返回值不同,其中子进程得到的返回值为零,父进程得到的返回值是新创建子进程的进程标识号。

l exec系统调用格式:(六种)int execl(path,arg0,arg1,…,argn,(char *)0)char *path, *arg0, *arg1, …, *argn ;exec调用进程的正文段被指定的目标文件的正文段所覆盖,其属性的变化方式与fork成功后从父进程那里继承属性的方式几乎是一样的。

系统中绝大多数命令都是通过exec来执行的,不但shell进程所创建的子进程使用它来执行用户命令,shell进程本身和它的祖先进程也是用exec来启动执行的。

l exit系统调用终止进程执行格式:void exit(status)int status ;参数status是调用进程终止时传递给其父进程的值。

如调用进程还有子进程,则将其所有子进程的父进程改为1号进程。

l wait系统调用等待子进程暂仃或终止格式:int wait(stat_loc) int wait((int *)0)int stat_loc ;wait调用将调用进程挂起,直到该进程收到一个被其捕获的信号或者它的任何一个子进程暂仃或终止为止。

如果wait调用之前已有子进程暂仃或终止,则该调用立即返回。

l lockf 锁定文件格式:int lockf(fd,fuction,size)int files, fuction; long size; fd –锁定文件标识function=0不锁定表示=1锁定=2测试和锁定=3测试有否被锁定size --锁定或解锁的字节数,0表示从文件的当前位置到文件尾。

Linux进程管理-实验报告

Linux进程管理-实验报告

《Linux 操作系统设计实践》实验一:进程管理实验目的:(1) 加深对进程概念的理解,明确进程和程序的区别。

(2)进一步认识并发执行的实质.(3) 学习通过进程执行新的目标程序的方法。

(4) 了解Linux 系统中进程信号处理的基本原理.实验环境:Red Hat Linux实验内容:(1)进程的创建编写一段程序,使用系统调用fork()创建两个子进程,当此进程运行时,在系统中有一个父进程和两个子进程活动,让每一个进程在屏幕上显示一个字符,父进程显示字符“a";子进程分别显示字符“b”和字符“c”,试观察记录屏幕上的显示结果,并分析原因.程序代码:#include<stdio。

h〉int main(){int p1 ,p2 ;while((p1=fork())==-1);if(p1==0)putchar(’b');else{while((p2=fork())==—1);if(p2==0)putchar(’c');elseputchar(’a');}return 0;}运行结果:bca分析:第一个while里调用fork()函数一次,返回两次。

子进程P1得到的返回值是0,父进程得到的返回值是新子进程的进程ID(正整数);接下来父进程和子进程P1两个分支运行,判断P1==0,子进程P1符合条件,输出“b”;接下来else里面的while里再调用fork()函数一次,子进程P2得到的返回值是0,父进程得到的返回值是新子进程的进程ID(正整数);接下来判断P2==0,子进程P2符合条件,输出“c”,接下来父进程输出“a”,程序结束。

(2)进程的控制①修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。

程序代码:#include〈stdio。

h>int main(){int p1,p2;while((p1=fork())==-1);if(p1==0)printf("Child1 is running!\n”);else{while((p2=fork())==—1);if(p2==0)printf(”Child2 is running!\n”);elseprintf(”Fath er is running!\n”);}return 0;}运行结果:Child1 is running!Child2 is running!Father is running!分析:本实验和上一个实验一样,只是将每个进程输出一个字符改为每个进程输出一句话.第一个while里调用fork()函数一次,返回两次。

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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一进程创建
【实验目的和要求】
1、1.了解进程的概念及意义;
2.了解子进程和父进程;
3.掌握创建进程的方法。

【实验内容】
1、1.子进程和父进程的创建;
2.编写附件中的程序实例;
3.撰写实验报告。

【实验原理】
1、原型:
#include <unistd.h>
pid_t fork(void);
在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。

新进程为子进程,而原进程为父进程。

fork函数创建子进程的过程为:使用fork函数得到的子进程是父进程的一个复制品,它从父进程继承了进程的地址空间,包括进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端,而子进程所独有的只有它的进程号、资源使用和计时器等。

通过这种复制方式创建出子进程后,原有进程和子进程都从函数fork返回,各自继续往下运行,但是原进程的fork返回值与子进程的fork返回值不同,在原进程中,fork返回子进程的pid,而在子进程中,fork返回0,如果fork返回负值,表示创建子进程失败。

子进程和父进程继续执行fork调用之后的指令。

子进程是父进程的副本。

例如,子进
程获得父进程数据空间、堆和栈的副本。

注意,这是子进程所有用的副本。

父进程和子进程并不共享这些存储空间部分。

父进程和子进程共享正文段。

2、原型:
#include <unistd.h>
pid_t vfork(void);
vfork函数的调用序列和返回值与fork相同,但两者的语义不同。

vfork函数用于创建一个新进程,而该进程的目的是exec一个新程序。

vfork不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec,它在父进程的空间中运行。

vfork保证子进程先运行,在它调用exit之后父进程才可能被调度运行,当子进程调用这两个函数中的任意一个时,父进程会恢复运行。

【程序代码】
1、1_fork.c
#include <stdlib.h>
#include <unistd.h>
int var = 10;
int main(int argc,char *argv[])
{
pid_t pid;
int num = 9;
pid = fork();
if(pid<0)//fork函数创建进程失败!
{
perror("fork");
}
if(pid==0)//子进程
{
var++;
num++;
printf("in son process var = %d,num=%d\n",var,num); }
else//父进程
{
sleep(1);
printf("in father process var=%d,num=%d\n",var,num); }
printf("common code area\n");
return 0;
}
2、2_vfork.c
#include <stdio.h>
#include <stdlib.h>
int var = 10;
int main(int argc,char *argv[])
{
pid_t pid;
int num = 9;
pid = vfork();//创建进程
if(pid<0)
{
perror("vfork");
}
if(pid == 0)
{
var++;
num++;
printf("in son process var=%d,num=%d\n",var,num);
_exit(0);
}
else
{
printf("in father process var=%d,num=%d\n",var,num);
}
return 0;
}
【实验步骤】
一、
1、打开终端,输入命令gedit 1_fork.c,在1_fork.c文件中输入1_fork.bmp中的代码;
2、输入命令gcc 1_fork.c -o 1_fork,回车后显示无错误;
3、输入命令:./1_fork运行程序。

二、
1、打开终端,输入命令gedit 2_vfork.c,在2_vfork.c文件中输入2_vfork.bmp中
的代码;
2、输入命令gcc 2_vfork.c -o 2_vfork,回车后显示无错误:
3、输入命令:./2_vfork运行程序。

【实验结果】
1、
从上面可以看到两次的运行结果不一样。

我们知道write函数是不带缓存的。

因为在fork之前调用write,所以其数据写到标准输出一次。

但是,标准I/O库是带缓存的。

如果标准输出连到终端设备,则它是行缓存的,否则它是全缓存的。

当以交互方式运行该程序时,只得到printf输出的行一次,其原因是标准输出缓存由新行符刷新。

但是当将标准输出重新定向到一个文件时,却得到printf输出行两次。

其原因是,在fork之前调用了printf一次,当调用fork时,该行数据仍在缓存中,然后在父进程数据空间复制到子进程中时,该缓存数据也被复制到子进程中。

于是那时父、子进程各自有了带该行内容的缓存。

在exit之前的第二个printf将其数据添加到现存的缓存中。

当每个进程终止时,其缓存中的内容被写到相应文件中。

2、
因为我们知道vfork保证子进程先运行,子进程运行结束后,父进程才开始运行。

所以,第一次打印的是子进程的打印的信息,可以看到var值变成了11。

子进程结束后,父进程运行,父进程首先打印fork调用返回给他pid的值(就是子进程pid)。

以上我们可以看出,vfork 创建的子进程和父进程运行的地址空间相同(子进程改变了var 值,父进程中的var值也进行了改变).
【实验体会】
1、由fork创建的新进程被称为子进程(child process)。

该函数被调用一次,但返回两次。

两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程
ID。

2、将子进程ID返回给父进程的理由是:因为一个进程的子进程可以多于一个,所有没
有一个函数使一个进程可以获得其所有子进程的进程ID。

fork使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getppid以获得其父进程的进程ID(进程ID 0总是由交换进程使用,所以一个子进程的进程ID不可能为0)。

3、vfork与fork一样都创建一个子进程; vfork和fork之间的另一个区别是:vfork保证
子进程先运行,在它调用exit之后父进程才可能被调度运行。

(如果在调用这两个
函数之前子进程依赖于父进程的进一步动作,则会导致死锁)。

相关文档
最新文档