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

合集下载

实验1:Linux操作、编程与进程创建

实验1:Linux操作、编程与进程创建

操作系统课程实验报告实验题目:Linux操作、编程与进程创建专业学生姓名班级学号教师陈兴国、朱洁指导单位计算机学院日期一、实验目的1.能够安装某Linux发行版本(例如Red Hat)2、了解Linux的启动过程3.了解Linux文件的组织结构4.熟悉X Window 环境5.练习使用Linux 常用命令6. 熟练使用Linux的C语言开发环境7.学习并掌握Linux 编译工具 gcc 的使用方法二、实验指导(大家自行补充进程创建的内容)0.安装Linux可以多引导方式在PC上安装linux,或是在Windows下利用VMware等虚拟机软件来安装linux.1.开机进入Linux后,Linux初始化过程中会显示大量初始化信息,要求学习者逐渐读懂这些初始化信息。

2.登录及修改Linux在相应初始化完成后,会在屏幕上显示“login:”此时输入用户名(即帐号)并键入回车,则系统显示”password:”,然后输入口令并键入回车。

此时,系统验证所键入的用户名和口令,若正确则成功进入系统。

若用户希望修改口令,则可以在成功进入系统后,在命令提示符($或#)后输入“passwd”并键入回车,则系统显示”new password:”.当用户键入新口令并键入回车后,系统再显示“retry new password:”,此时需要再次键入刚才输入的新口令并键入回车,则系统接收并记住新口令。

3.退出、注销当用户不再使用Linux时,在离开前,通常应键入“logout”命令或Ctrl+D来退出帐号4.关机或重启在Linux下,涉及到关机或重启的命令有1)halt命令。

这是最常用的关机方式2) reboot命令。

用户只是想退出操作系统,并不想关机,还想再进入其他OS(例如WINDOWS)。

3)shutdown命令。

在多用户机器上,系统管理员在关机前,通知各用户即将关机,以便给各用户留下一定的时间作保存、退出工作。

4)在窗口工作方式下,可以通过与Windows类似的开始菜单老关机或重启:“开始”→“关闭系统” →“关机或重新启” →…操作系统实验指导5.窗口工作方式与终端工作方式进入窗口工作方式后,可以按Ctrl+Alt+F2进入终端工作方式,之后可以按Ctrl+Alt+F7再从终端工作方式回到窗口工作方式。

进程创建实验报告

进程创建实验报告

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

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

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

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

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

二、实验环境本实验使用的是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进程管理的实验报告

实验报告: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) 加深对进程概念的理解,明确进程和程序的区别。

(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实验报告1

linux实验报告1

linux实验报告1《Linux 实验报告 1》一、实验目的本次 Linux 实验的主要目的是让我们熟悉 Linux 操作系统的基本操作和常用命令,了解其文件系统结构,并能够在终端环境下进行一些简单的任务处理。

二、实验环境本次实验使用的是虚拟机软件 VirtualBox 中安装的 Ubuntu 2004LTS 操作系统。

三、实验内容及步骤(一)用户登录与系统信息查看1、打开虚拟机,进入 Ubuntu 系统登录界面,输入用户名和密码登录。

2、在终端中输入命令“uname a”查看系统内核信息,包括操作系统类型、内核版本等。

3、输入“lsb_release a”命令查看系统的发行版信息,如发行版名称、版本号等。

(二)文件和目录操作1、使用“cd”命令切换到不同的目录,如“cd /home”切换到用户主目录,“cd /etc”切换到系统配置目录等。

2、使用“ls”命令列出当前目录下的文件和子目录,结合“l”选项查看详细信息,包括文件权限、所有者、大小、修改时间等。

3、创建新目录,使用“mkdir testdir”命令在当前目录下创建一个名为“testdir”的目录。

4、在新创建的目录中创建一个文本文件,使用“touch testfiletxt”命令创建一个空的文本文件。

5、使用“cat”命令查看文本文件的内容,由于文件为空,此时没有输出。

6、使用“vi”或“nano”编辑器编辑文本文件,输入一些内容后保存退出。

7、使用“cp”命令复制文件,如“cp testfiletxt testfile_copytxt”复制文件并命名为“testfile_copytxt”。

8、使用“mv”命令移动文件,将“testfile_copytxt”移动到其他目录。

9、使用“rm”命令删除文件和目录,注意删除目录时需要使用“r”选项,如“rm r testdir”删除“testdir”目录及其包含的所有文件。

(三)文件权限管理1、使用“ls l”命令查看文件的权限信息,了解权限的表示方式,如“rwrr”等。

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程序文件,观察控制台输出结果。

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

linux实验报告总结-共10篇

linux实验报告总结-共10篇

∣inux实验报告总结(共10篇)(Linux实验报告汇总)(一)Shell 编程一、实验目的:1)掌握在Linux下的C编程基本方法。

2)掌握shell编程方法。

3)掌握dialog图形化编程方法。

二、实验内容1、编写能输出“Hello world!”问候语的C程序,并在终端中编译、执行。

要求记录所使用的命令及结果。

#include stdio.hmain()(printf(Hello world!\n);)2、编写一个C程序并设置其在后台执行,其功能是在一段时间后(可自行设置),在屏幕上显示信息:Time for play!,写出相应的程序、命令及结果。

#include stdio.hmain()(int time=0;printf(请输入等待时间(单位:s):);scanf(%d/&amp;time);sleep(time);printf(Time for play!\n);)3、编写C程序,求1到100之间整数的阶乘和,并对程序进行优化。

写出程序、命令和结果。

#include stdio.hmain()int i;double s = l,sum = 0;for( i= l;i= 100;i++)sum+=s*=i;printf( 1到100之间整数的阶乘和:%f\n,sum);printf( 1到100之间整数的阶乘和:%e\n,sum);}4、编写C程序,根据键盘输入的半径求圆面积,要求在命令行周率(P∣=3∙14,PI=3∙14159,PI=3.14159626 等)进行编使用不同的译,写出程序、命令和结果。

#include stdio.hint main()double r = 0.0 , Area = 0.0;printf(请输入半径:);scanf(%lf, &amp;r);Area = PI * r * r;printf(圆面积:%f∖n, Area);)5、编写shell程序sh.l,完成向用户输出“你好!”的问候语。

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

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

实验一进程创建【实验目的和要求】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之后父进程才可能被调度运行,当子进程调用这两个函数中的任意一个时,父进程会恢复运行。

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、实验结果结果也是各语句乱序混叠输出。

linux程序设计实验报告

linux程序设计实验报告

linux程序设计实验报告Linux程序设计实验报告引言在计算机科学领域,操作系统是一项至关重要的基础设施。

Linux作为一种开源的操作系统,具有广泛的应用和开发者社区。

本次实验旨在通过Linux程序设计,深入了解Linux操作系统的内部机制和编程技巧。

一、实验背景与目的Linux操作系统以其稳定性、安全性和灵活性而闻名。

本次实验的目的是通过编写Linux程序,探索Linux操作系统的核心原理和实践技巧。

通过实践操作,我们可以更好地理解Linux内核、进程管理、文件系统和网络通信等方面的工作原理。

二、实验环境与工具本次实验使用的实验环境为Ubuntu操作系统,我们将使用C语言进行程序设计。

以下是本次实验所用到的工具和软件:1. Ubuntu 18.04 LTS操作系统2. GCC编译器3. GNU Make工具4. Vim文本编辑器三、实验内容与步骤1. 进程管理在Linux操作系统中,进程是程序的执行实例。

我们将通过编写一个简单的多进程程序来理解进程的创建、调度和终止。

首先,我们需要使用fork()系统调用创建一个新的子进程。

然后,通过exec()系统调用加载一个新的程序到子进程中。

最后,使用wait()系统调用等待子进程的结束并回收资源。

2. 文件系统Linux操作系统中的文件系统是一种层次化的存储结构。

我们将通过编写一个简单的文件读写程序来理解文件系统的基本操作。

首先,我们需要使用open()系统调用打开一个文件,并指定读写权限。

然后,使用read()和write()系统调用读取和写入文件的内容。

最后,使用close()系统调用关闭文件。

3. 网络通信Linux操作系统提供了丰富的网络通信功能。

我们将通过编写一个简单的网络通信程序来理解网络套接字的使用。

首先,我们需要使用socket()系统调用创建一个套接字,并指定通信协议。

然后,使用bind()系统调用将套接字绑定到指定的IP地址和端口号。

进程创建实验报告

进程创建实验报告

实验名称:进程创建实验实验目的:1. 理解进程的概念和进程创建的过程。

2. 掌握使用系统调用创建进程的方法。

3. 分析进程创建的参数和返回值。

4. 了解进程的层次结构。

实验环境:操作系统:Linux编译器:gcc开发环境:Eclipse/Visual Studio Code实验内容:1. 理论学习- 进程的概念:进程是计算机系统中正在运行的可执行程序实例,具有独立的内存空间、执行状态和系统资源。

- 进程创建:操作系统通过创建一个新的进程来启动一个程序,新的进程会继承父进程的某些属性。

2. 实验步骤(1)编写C语言程序,使用系统调用创建进程。

(2)观察进程的创建过程,分析进程的层次结构。

(3)测试进程创建的参数和返回值。

实验代码:```c#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>int main() {pid_t pid;pid = fork(); // 创建子进程if (pid == 0) { // 子进程printf("子进程 %d\n", getpid());exit(0);} else if (pid > 0) { // 父进程printf("父进程 %d, 子进程 %d\n", getpid(), pid);exit(0);} else { // 创建进程失败perror("fork error");exit(1);}return 0;}```实验结果与分析:1. 进程创建过程- 通过`fork()`系统调用创建子进程,返回值分别为子进程ID和0。

父进程的返回值为子进程ID,子进程的返回值为0。

- 在父进程中,打印出父进程和子进程的进程ID,观察到父进程和子进程的进程ID不同。

进程创建实验报告

进程创建实验报告

进程创建实验报告第一篇:进程创建实验报告实验二进程的创建一、实验目的熟悉进程的创建过程,了解系统调用函数fork()和 execl()。

二、实验内容1、阅读实例代码fork1,并编辑、编译、运行,记录程序的运行结果,尝试给出合理的解释,查阅有关资料,掌握系统调用fork()的用法,返回值的意义。

2、阅读实例代码fork2,并编辑、编译、运行,记录程序的运行结果,尝试给出合理的解释,查阅有关资料,掌握在程序中运行一个操作系统命令和运行一个程序的方法。

3、修改fork2,使之能把运行的命令和程序作为参数传给fork2。

三、设计思想1、程序框架pid =-1 pid = 0 pid > 02、用到的文件系统调用函数 fork()和 execl()四、调试过程1、测试数据设计(1)fork1 命名程序1:编写程序1:编译程序1:运行程序1:(2)fork2 编写程序2:运行程序2:(3)修改fork2 编写修改程序2:修改后的运行结果:2、测试结果分析(1)对于程序1:因为系统调用fork()函数是一次调用两次返回值,而且先生成子进程还是父进程是不确定的,所以第一次执行生成子进程的时候返回的pid = 0,判断pid!=-1,所以输出了I’m the child.I’m the parent.第二次,执行父进程的时候,返回的是子进程的进程号pid > 0,即pid的值仍然不为-1,所以又输出了一次I’m the child.I’m the parent。

(2)对于程序2:第一次调用fork()函数时,由于执行的是子进程还是父进程是随机的,所以第一次对父进程返回的是子进程的进程号(大于0),即pid > 0,所以输出I’m the parent.Program end.当第二次执行子进程时返回值是0,即pid = 0,所以输出I’m the child.并调用了execl()函数,查看了指定路径中的文件。

操作系统实验报告(进程的创建)范文

操作系统实验报告(进程的创建)范文

实验题目进程的创建小组合作否姓名班级学号一、实验目的1、了解进程的创建。

2、了解进程间的调用以及实现。

3、分析进程竞争资源的现象,学习解决互斥的方法。

4、加深对进程概念的理解,认识并发执行的本质。

二.实验环境Windows 系统的计算机一台,安装了Linux虚拟机三、实验内容与步骤1、fork()系统调用的使用例子程序代码:#include<stdio.h>#include<sys/types.h>#include<unistd.h>int glob=3;int main(void){pid_t pid;int loc=3;printf("before fork();glod=%d,loc=%d.\n",glob,loc);if((pid=fork())<0){printf("fork() error. \n");exit(0);}else if(pid==0){glob++;loc--;printf("child process changes glob and loc: \n");}elsewait(0);printf("parent process doesn't change the glob and loc:\n");printf("glob=%d,loc=%d\n",glob,loc);exit(0);}运行结果:2、理解vofork()调用:程序代码:#include<stdio.h>#include<sys/types.h>#include<unistd.h>int glob=3;int main(void){pid_t pid;int loc=3;if((pid=vfork())<0){printf("vfork() error\n");exit(0);}else if(pid==0){glob++;loc--;printf("child process changes the glob and loc\n");exit(0);}elseprintf ("parent process doesn't change the glob and loc\n");printf("glob=%d,val=%d\n",glob,loc);}运行结果:3、给进程指定一个新的运行程序的函数exec().程序代码:printe1.c代码:#include<stdio.h>int main(int argc,char * argv[]){int n;char * * ptr;extern char * * environ;for(n=0;n<argc;n++)printf("argv[%d]:%s\n",n,argv[n]);for(ptr=environ; * ptr!=0;ptr++)printf("%s\n",* ptr);exit(0);}file4.c代码如下:#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<sys/wait.h>char * env_list[]={"USER=root","PATH=/root/",NULL};int main(){pid_t pid;if((pid=fork())<0){printf("fork error!\n");exit(0);}else if(pid==0){if(execle("/root/print1","print1","arg1","arg2",(char *)0,env_list)<0) printf("execle error!\n");exit(0);}if((waitpid(pid,NULL,0))<0)printf("WAIT ERROR!\n");exit(0);if((pid=fork())<0){printf("fork error!\n");exit(0);}else if(pid==0){if(execlp("print1","print1","arg1",(char *)0)<0)printf("execle error!\n");exit(0);}exit(0);}运行结果:4、进程终止函数exit()。

操作系统实验报告(包括线程,进程,文件系统管理,linux+shell简单命令)

操作系统实验报告(包括线程,进程,文件系统管理,linux+shell简单命令)

操作系统实验报告班级:030613学号:03061331姓名:裴帅帅实验一:进程的建立一、实验内容创建进程及子进程,在父子进程间实现进程通信,创建进程并显示标识等进程控制块的属性信息,显示父子进程的通信信息和相应的应答信息。

使用匿名管道实现父子进程之间的通信。

二、源程序1、创建匿名管道SECURITY_ATTRIBUTES sa;sa.bInheritHandle=true;sa.lpSecurityDescriptor=NULL;sa.nLength=sizeof(SECURITY_ATTRIBUTES);if(!CreatePipe(&m_hRead,&m_hWrite,&sa,0)){MessageBox("创建匿名管道失败");return false;}2、创建子进程STARTUPINFO si;ZeroMemory(&si,sizeof(STARTUPINFO));si.cb=sizeof(STARTUPINFO);si.dwFlags=STARTF_USESTDHANDLES;si.hStdInput=m_hRead;si.hStdOutput=m_hWrite;si.hStdError=GetStdHandle(STD_ERROR_HANDLE);if(!CreateProcess(NULL,"子进.exe",NULL,NULL,true,0,NULL,NULL,&si,&pi)) {MessageBox("创建子进程失败");CloseHandle(m_hRead);CloseHandle(m_hWrite);m_hRead=NULL;m_hWrite=NULL;return;}3、销毁子进程if(m_hRead)CloseHandle(m_hRead);if(m_hWrite)CloseHandle(m_hWrite);TerminateProcess(pi.hProcess ,0);4、向匿名管道中写信息即发送信息DWORD deWrite;CString sendData;m_s.GetWindowText(sendData);int length;length=sendData.GetLength ();char *buffer=new char[length+1];for(int i=0;i<length;i++){buffer[i]=sendData[i];}buffer[length]='\0';if(!WriteFile(m_hWrite,buffer,length,&deWrite,NULL)){MessageBox("发送数据失败");}delete buffer;5、从匿名管道中读取信息即接收信息char buff[100];DWORD deRead;if(!ReadFile(m_hRead,buff,100,&deRead,NULL)){MessageBox("读取数据失败");}CString receiveData;for(int i=0;i<=(int)deRead;i++){receiveData+=buff[i];}receiveData+='\0';m_r.SetWindowText (receiveData);三、实验结果实验结果实现了父进程向匿名管道中写信息,然后在子进程端可以从匿名管道中读取该信息;也可以子进程向管道中写入信息,然后父进程从中读取后显示。

嵌入式linux实验报告

嵌入式linux实验报告

嵌入式操作系统Linux实验报告专业:计算机科学与技术班级:13419011学号:1341901124姓名:武易组员:朱清宇实验一Linux下进程的创建一实验目的1.掌握Linux下进程的创建及退出操作2.了解fork、execl、wait、waitpid及之间的关系二实验内容创建进程,利用fork函数创建子进程,使其调用execl函数,退出进程后调用wait或waitpid清理进程。

三实验过程1.进程的创建许多进程可以并发的运行同一程序,这些进程共享内存中程序正文的单一副本,但每个进程有自己的单独的数据和堆栈区。

一个进程可以在任何时刻可以执行新的程序,并且在它的生命周期中可以运行几个程序;又如,只要用户输入一条命令,shell进程就创建一个新进程。

fork函数用于在进程中创建一个新进程,新进程是子进程。

原型如下:#include<sys/types.h> /* 提供类型pid_t的定义 */#include<unistd.h> /* 提供函数的定义 */pid_t fork(void);使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间fork系统调用为父子进程返回不同的值,fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:在父进程中,fork返回新创建子进程的进程ID;✓在子进程中,fork返回0;✓如果出现错误,fork返回一个负值;用fork创建子进程后执行的是和父进程相同的程序,子进程可以通过调用exec函数以执行另一个程序。

当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程(例如其m a i n函数)开始执行。

调用e x e c并不创建新进程,进程I D并未改变,只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。

e x e c函数原型execl,execlp,execle,execv,execve和execvp2.进程的退出一个进程正常终止有三种方式:由main()函数返回;调用exit()函数;调用_exit()或_Exit()函数。

Linux 进程创建实验报告

Linux 进程创建实验报告

深圳大学实验报告课程名称:Linux系统编程实验项目名称:进程控制和守护进程的创建学院:计算机与软件学院专业:电子信息工程指导教师:冯禹洪报告人:卢国鹏学号:2012130303 班级:电子3班实验时间:实验报告提交时间:教务处制一、实验目标:1.掌握fork()系统调用及进程的相关概念2.掌握wait()和waitpid()系统调用3.掌握进程组,会话进程等概念和setsid()系统调用4.掌握文件重定向的技巧5.掌握创建守护进程的步骤及其实现二、实验环境与工件1.湖边Linux实验室2.Fedora 13三、实验内容与步骤下面的程序会用到如下程序段:从命令行获取数字参数,参考实现见下图:1.编例实现创建n个子进程P1,P2,…,Pn,其中,各进程之间的关系是:P1是调用进程的子进程,P(k+1)是Pk的子进程。

请打印各进程本身的进程号、父进程号,子进程号。

参考运行结果如下。

要求:(1)每个父进程都要等待子进程退出后才能退出;(2)n通过命令行参数传入;(3)附上源代码截图和运行结果截图。

(20分)2.编例实现创建n个子进程P1,P2,…,Pn,其中,各进程之间的关系是:P1,…,Pn都是调用进程的子进程。

请打印各进程本身的进程号、父进程号,子进程号。

参考运行结果如下。

要求:(1)每个父进程都要等待子进程退出后才能退出;(2)n通过命令行参数传入;(3)附上源代码截图和运行结果截图。

(20分)3.编例实现创建n=2d-2个子进程P1,P2,…,Pn,其中,d是树的深度且d>=1,P1和P2是调用进程的子进程,P3和P4是P1的子进程,P5和P6是P2的子进程。

也就是各进程之间的关系是:Pi是P2i+1和P2i+2的父进程,也是组成二叉树的关系,如下图所示。

对于不是叶子的进程,将其ID和父进程ID打印出来。

参考运行结果如下。

要求:(1)每个父进程都要等待子进程退出后才能退出;(2)d通过命令行参数传入;(3)附上源代码截图和运行结果截图。

操作系统实验报告(进程的创建)

操作系统实验报告(进程的创建)

实验题目进程的创建小组合作否姓名班级学号一、实验目的1、了解进程的创建。

2、了解进程间的调用以及实现。

3、分析进程竞争资源的现象,学习解决互斥的方法。

4、加深对进程概念的理解,认识并发执行的本质。

二.实验环境Windows 系统的计算机一台,安装了Linux虚拟机三、实验内容与步骤1、fork()系统调用的使用例子程序代码:#include<stdio.h>#include<sys/types.h>#include<unistd.h>int glob=3;int main(void){pid_t pid;int loc=3;printf("before fork();glod=%d,loc=%d.\n",glob,loc);if((pid=fork())<0){printf("fork() error. \n");exit(0);}else if(pid==0){glob++;loc--;printf("child process changes glob and loc: \n");}elsewait(0);printf("parent process doesn't change the glob and loc:\n");printf("glob=%d,loc=%d\n",glob,loc);exit(0);}运行结果:2、理解vofork()调用:程序代码:#include<stdio.h>#include<sys/types.h>#include<unistd.h>int glob=3;int main(void){pid_t pid;int loc=3;if((pid=vfork())<0){printf("vfork() error\n");exit(0);}else if(pid==0){glob++;loc--;printf("child process changes the glob and loc\n");exit(0);}elseprintf ("parent process doesn't change the glob and loc\n");printf("glob=%d,val=%d\n",glob,loc);}运行结果:3、给进程指定一个新的运行程序的函数exec().程序代码:printe1.c代码:#include<stdio.h>int main(int argc,char * argv[]){int n;char * * ptr;extern char * * environ;for(n=0;n<argc;n++)printf("argv[%d]:%s\n",n,argv[n]);for(ptr=environ; * ptr!=0;ptr++)printf("%s\n",* ptr);exit(0);}代码如下:#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<sys/wait.h>char * env_list[]={"USER=root","PATH=/root/",NULL};int main(){pid_t pid;if((pid=fork())<0){printf("fork error!\n");exit(0);}else if(pid==0){if(execle("/root/print1","print1","arg1","arg2",(char *)0,env_list)<0) printf("execle error!\n");exit(0);}if((waitpid(pid,NULL,0))<0)printf("WAIT ERROR!\n");exit(0);if((pid=fork())<0){printf("fork error!\n");exit(0);}else if(pid==0){if(execlp("print1","print1","arg1",(char *)0)<0)printf("execle error!\n");exit(0);}exit(0);}运行结果:4、进程终止函数exit()。

操作系统实验报告1-Linux操作、使用、编程与进程创建

操作系统实验报告1-Linux操作、使用、编程与进程创建
8.多次连续反复运行上述程序,观察屏幕显示结果的顺序,直至出现不一样的情况为止。记下这种情况,试简单分析其原因。
9.修改程序,在父、子进程中分别使用wait、exit等系统调用“实现”其同步推进,多次反复运行改进后的程序,观察并记录运行结果。
代码
#include<stdio.h>
main()
{
int p1,p2,i;
switch(pid)
{
case -1:
printf("fork fail!\n");
exit(1);
case 0:
printf("subprocess!\n");
exit(0);
default:
wait(0);
printf("complete!\n");
exit(0);
}
}
实验过程
四、实验小结(针对实验内容逐项小结实验中发现的问题、自己的解决方法、心得体会等)
while((p1=fork())==-1);
if(p1==0)
{
for(i=0;i<4;i++){
//sleep(1);
printf("daughter %d\n",i);
}}
else {
while ((p2=fork())==-1);
if(p2==0)
{for(i=0;i<4;i++)
{
//sleep(1);
实验时间
2013

10

8

指导单位
软件工程系
指导教师
杨健
学生姓名
班级学号

进程创建撤销实验报告

进程创建撤销实验报告

一、实验目的1. 理解进程的概念及其在操作系统中的作用。

2. 掌握进程创建和撤销的基本原理和方法。

3. 通过实验加深对进程管理机制的理解。

二、实验环境1. 操作系统:Linux2. 编程语言:C/C++3. 编译器:GCC三、实验原理在操作系统中,进程是系统进行资源分配和调度的基本单位。

进程创建是指从无到有地创建一个新的进程,而进程撤销则是指结束一个进程的生命周期。

进程创建和撤销是操作系统进程管理中的重要操作。

四、实验内容1. 进程创建实验2. 进程撤销实验五、实验步骤1. 进程创建实验(1)创建一个新进程```c#include <stdio.h>#include <unistd.h>#include <sys/types.h>int main() {pid_t pid = fork(); // 创建子进程if (pid == -1) {perror("fork failed");return 1;} else if (pid == 0) {// 子进程printf("Child process: PID = %d\n", getpid());// 执行子进程的任务} else {// 父进程printf("Parent process: PID = %d\n", getpid());// 等待子进程结束wait(NULL);}return 0;}```(2)编译并运行程序```bashgcc -o process_create process_create.c./process_create```(3)观察输出结果在控制台会看到两个进程的PID,其中一个为父进程,另一个为子进程。

2. 进程撤销实验(1)创建一个新进程```c#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>int main() {pid_t pid = fork(); // 创建子进程if (pid == -1) {perror("fork failed");return 1;} else if (pid == 0) {// 子进程printf("Child process: PID = %d\n", getpid()); // 执行子进程的任务sleep(10); // 子进程睡眠10秒} else {// 父进程printf("Parent process: PID = %d\n", getpid()); // 等待子进程结束wait(NULL);}return 0;}```(2)编译并运行程序```bashgcc -o process_destroy process_destroy.c./process_destroy```(3)观察输出结果在控制台会看到两个进程的PID,父进程会等待子进程结束。

  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 <stdio.h>
#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>
#include <unistd.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之后父进程才可能被调度运行。

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

相关文档
最新文档