父进程和子进程

父进程和子进程子进程是父进程的复制品Unix/linux系统中的进程创建是这样的,理解起来有点绕。

父进程先执行fork()系统调用,这个调用的结果是系统中多出了一个跟父进程内容完全一样的进程,这个新进程被称为子进程,当然该进程的PCB 中父进程指针是指向第一个进程的。

前后两个进程各自有自己的地址空间,形式上有点像把一个文件拷贝了一个副本。

虽然资源也相互独立,但拷贝时父进程执行过程已生成的数据,子进程也拷了一份。

说简单点像一个执行到半路的程序突然在系统中多出了一个孪生兄弟,什么都跟自己一样,但要管自己叫老爸。

当然这样的简单复制本身是没什么用处的。

要让它发挥作用,还需要再执行exec( B )系统调用,这个调用可以让当前进程转而执行另一个可执行代码(一个新的程序)。

简单的说进程本来在执行A程序,一旦执行到这个调用,就转而开始执行B程序。

至此,父子两进程就变的不一样了,但不管它们各自执行的什么代码,其父子关系不会改变,在父进程中可以使用子进程的进程ID(在执行fork()时的返回值中得到)来中止子进程的执行。

当然子进程也可以因为自己的执行程序结束而终止执行父进程和子进程先后执行的问题,是这样的,在fork之后,是父进程先执行,然后一个时间片到达之后就是子进程再执行了。

每一个进程都有一个父进程,当进程终止或者结束的时候,都会给父进程发送一个SIGCHLD信号,系统默认是父进程忽略这个信号,如果父进程希望被告知其子进程的这种状态改变,则应该捕获这个信号,捕捉函数一般是wait函数来取得子进程ID和子进程状态。

对于键盘上的Ctrl+按键的操作,一般是产生一个信号,然后进程捕捉这个信号。

另外当然我们可以直接使用这些信号,通过kill命令,把信号发给相应的其他进程。

wait函数是父进程等待子进程结束,也就是说当子进程结束的时候会发送给父进程一个信号SIGCHID,这时候父进程通过wait函数接收到这个信号,这时候父进程就知道子进程结束了。

这个正好用在shell解析器的编写里面,shell解析器作为父进程,而命令行命令作为子进程,当子进程结束的时候就会告诉父进程,这时候父进程就可以提示输入下一个命令了。

一个进程只能为他自己或者他的子进程设置进程组ID,在他的子进程调用了exec函数之后,就不能再改变该子进程的进程组ID了。

Linux进程管理对于电脑使用的玩家的常用软件,然后我就学习及深入的研究Linux进程管理,在这里和大家一起探讨Linux进程管理的使用方法,希望对大家有用。

程序是为了完成某种任务而设计的软件,比如OpenOffice 是程序。

什么是进程呢?进程就是运行中的程序。

一个运行着的程序,可能有多个进程。

比如 所用的WWW服务器是apache服务器,当管理员启动服务后,可能会有好多人来访问,也就是说许多用户来同时请求httpd服务,apache服务器将会创建有多个httpd进程来对其进行服务。

1、程序和进程;进程分类;进程一般分为交互进程、批处理进程和守护进程三类。

值得一提的是守护进程总是活跃的,一般是后台运行,守护进程一般是由系统在开机时通过脚本自动激活启动或超级管理用户root来启动。

比如在Fedora或Redhat中,我们可以定义httpd服务器的启动脚本的运行级别,此文件位于/etc/init.d目录下,文件名是httpd,/etc/init.d/httpd 就是httpd服务器的守护程序,当把它的运行级别设置为3和5时,当系统启动时,它会跟着启动。

[root@localhost ~]# chkconfig --level 35 httpd on由于守护进程是一直运行着的,所以它所处的状态是等待请求处理任务。

比如,我们是不是访问 , 的httpd服务器都在运行,等待着用户来访问,也就是等待着任务处理。

1.2 进程的属性;进程ID(PID):是唯一的数值,用来区分进程;父进程和父进程的ID(PPID);启动进程的用户ID(UID)和所归属的组(GID);进程状态:状态分为运行R、休眠S、僵尸Z;进程执行的优先级;进程所连接的终端名;进程资源占用:比如占用资源大小(内存、CPU占用量);1.3 父进程和子进程;他们的关系是管理和被管理的关系,当父进程终止时,子进程也随之而终止。

但子进程终止,父进程并不一定终止。

比如httpd服务器运行时,我们可以杀掉其子进程,父进程并不会因为子进程的终止而终止。

在Linux 进程管理中,当我们发现占用资源过多,或无法控制的进程时,应该杀死它,以保护系统的稳定安全运行;2、Linux进程管理;对于Linux进程管理,是通过Linux进程管理工具实现的,比如ps、kill、pgrep等工具;ps 监视进程工具;ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用top工具;ps 的参数说明;ps 提供了很多的选项参数,常用的有以下几个;l 长格式输出;u 按用户名和启动时间的顺序来显示进程;j 用任务格式来显示进程;f 用树形格式来显示进程;a 显示所有用户的所有进程(包括其它用户);x 显示无控制终端的进程;r 显示运行中的进程;ww 避免详细参数被截断;我们常用的选项是组合是aux 或lax,还有参数f的应用;ps aux 或lax 输出的解释;USER 进程的属主;PID进程的ID;PPID 父进程;%CPU 进程占用的CPU百分比;%MEM 占用内存的百分比;NI 进程的NICE值,数值大,表示较少占用CPU时间; VSZ 进程虚拟大小;RSS 驻留中页的数量;WCHANTTY 终端IDSTAT 进程状态D Uninterruptible sleep (usually IO)R 正在运行可中在队列中可过行的;S 处于休眠状态;T 停止或被追踪;W 进入内存交换(从内核2.6开始无效); X 死掉的进程(从来没见过);Z 僵尸进程;< 优先级高的进程N 优先级较低的进程L 有些页被锁进内存;s 进程的领导者(在它之下有子进程);l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)+ 位于后台的进程组;WCHAN 正在等待的进程资源;START 启动进程的时间;TIME 进程消耗CPU的时间;COMMAND 命令的名称和参数;2.1.2 ps 应用举例;实例一:ps aux 最常用[root@localhost ~]# ps -aux |more可以用| 管道和more 连接起来分页查看;[root@localhost ~]# ps -aux >N 优先级较低的进程L 有些页被锁进内存;s 进程的领导者(在它之下有子进程);l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)+ 位于后台的进程组;WCHAN 正在等待的进程资源;START 启动进程的时间;TIME 进程消耗CPU的时间;COMMAND 命令的名称和参数;2.1.2 ps 应用举例;实例一:ps aux 最常用[root@localhost ~]# ps -aux |more可以用| 管道和more 连接起来分页查看;[root@localhost ~]# ps -aux >ps001.txt[root@localhost ~]# more ps001.txt这里是把所有进程显示出来,并输出到ps001.txt文件,然后再通过more 来分页查看;实例二:和grep 结合,提取指定程序的进程;[root@localhost ~]# ps aux |grep httpdroot 4187 0.0 1.3 24236 10272 ? Ss 11:55 0:00 /usr/sbin/httpd apache 4189 0.0 0.6 24368 4940 ? S 11:55 0:00 /usr/sbin/httpd apache 4190 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd apache 4191 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd apache 4192 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd apache 4193 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd apache 4194 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd apache 4195 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd apache 4196 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd root 4480 0.0 0.0 5160 708 pts/3 R+ 12:20 0:00 grep httpd实例二:父进和子进程的关系友好判断的例子[root@localhost ~]# ps auxf |grep httpdroot 4484 0.0 0.0 5160 704 pts/3 S+ 12:21 0:00 \_ grep httpdroot 4187 0.0 1.3 24236 10272 ? Ss 11:55 0:00 /usr/sbin/httpd apache 4189 0.0 0.6 24368 4940 ? S 11:55 0:00 \_ /usr/sbin/httpdapache 4190 0.0 0.6 24368 4932 ? S 11:55 0:00 \_ /usr/sbin/httpd apache 4191 0.0 0.6 24368 4932 ? S 11:55 0:00 \_ /usr/sbin/httpd apache 4192 0.0 0.6 24368 4932 ? S 11:55 0:00 \_ /usr/sbin/httpd apache 4193 0.0 0.6 24368 4932 ? S 11:55 0:00 \_ /usr/sbin/httpd apache 4194 0.0 0.6 24368 4932 ? S 11:55 0:00 \_ /usr/sbin/httpdapache 4195 0.0 0.6 24368 4932 ? S 11:55 0:00 \_ /usr/sbin/httpdapache 4196 0.0 0.6 24368 4932 ? S 11:55 0:00 \_ /usr/sbin/httpd这里用到了f参数;父与子关系一目了然;2.2 pgreppgrep 是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行。

合集下载

fork 子进程不继承父进程打开的文件描述符

fork 子进程不继承父进程打开的文件描述符

fork 子进程不继承父进程打开的文件描述符1.引言1.1 概述概述在操作系统中,进程是指正在执行的程序的实例。

当一个进程创建子进程时,子进程会继承父进程的一些属性和资源,以便能够继续执行相同的操作。

然而,在某些情况下,子进程并不会继承父进程的所有属性和资源,其中一个重要的例子就是父进程打开的文件描述符。

文件描述符是用来标识一个文件或者文件流的抽象概念。

当一个进程需要对文件进行操作时,它必须首先打开该文件,并获得一个文件描述符。

父进程通过打开文件来获取文件描述符,而子进程在创建时则不会继承这些父进程已打开的文件描述符。

这种设计有其合理性和必要性。

首先,父进程打开的文件描述符可能会包含一些敏感信息,比如数据库连接信息、加密密钥等。

如果这些信息被子进程继承,有可能会导致安全风险。

其次,大多数情况下,子进程并不需要继承父进程的文件描述符。

子进程是作为独立的实体运行的,通常具有自己独立的文件操作需求。

虽然子进程不继承父进程的文件描述符,但是子进程可以通过其他方式来获取和打开文件。

举例来说,子进程可以使用文件路径来打开需要的文件,或者通过网络传输文件描述符等方式来获取父进程已打开的文件描述符。

因此,对于子进程来说,并不存在无法获取文件描述符的问题。

总之,子进程不继承父进程打开的文件描述符是有意而为的设计。

这一设计使得父子进程之间的资源隔离得以实现,同时也增强了系统的安全性。

在实际应用中,开发人员需要考虑到这一点,并正确处理子进程的文件操作需求。

1.2文章结构文章结构部分的内容可以描述文章的整体框架和组织结构,包括各个章节的主题和内容概要。

可以按照以下方式编写文章结构部分的内容。

文章结构部分:本文主要围绕着fork子进程不继承父进程打开的文件描述符展开讨论,旨在探讨子进程不继承父进程文件描述符的原因以及对应的影响和应用。

在引言部分,我们将通过概述对fork子进程和文件描述符的概念进行简要介绍,并给出本文的目的。

关于父进程和子进程关系,以及fork()进程数量

关于父进程和子进程关系,以及fork()进程数量

关于⽗进程和⼦进程关系,以及fork()进程数量⽗进程和⼦进程关系:⼦进程拥有⽗进程⼏乎所有资源的拷贝,重新复制存储空间,包括标准输⼊,输出的缓冲空间以及程序。

当程序中出现fork后,⼦进程将从fork语句开始复制程序代码,并且在⼦进程中执⾏。

关于fork()执⾏后,在⼦进程中返回值为0,在⽗进程中返回值为整数即⼦进程的ID。

1)循环fork()N次,产⽣多少个⼦进程/** fork_test.c* version 3* Created on: 2010-5-29* Author: wangth*/#include <unistd.h>#include <stdio.h>int main(void){int i=0;for(i=0;i<3;i++){pid_t fpid=fork();if(fpid==0)printf("son/n");elseprintf("father/n");}return 0;} 根据以上程序可知,产⽣的⼦进程数量为:1+2+4+……+2N-1执⾏printf的打印次数为:2*(1+2+4+……+2N-1)次2)⼦进程会复制⽗进程的输⼊输出缓冲区,如果⽗进程的输⼊输出缓冲区没有输出的话,⼦进程会复制int main() {pid_t fpid;//fpid表⽰fork函数返回的值//printf("fork!");printf("fork!/n");fpid = fork();if (fpid < 0)printf("error in fork!");else if (fpid == 0)printf("I am the child process, my process id is %d/n", getpid());elseprintf("I am the parent process, my process id is %d/n", getpid());return 0;}3)以下fork()连续中会产⽣多少个新的⼦进程#include <stdio.h>#include <unistd.h>int main(int argc, char* argv[]){fork();fork() && fork() || fork();fork();return 0;}如果有⼀个这样的表达式:cond1 && cond2 || cond3 这句代码会怎样执⾏呢?1、cond1为假,那就不判断cond2了,接着判断cond32、cond1为真,这⼜要分为两种情况:a、cond2为真,这就不需要判断cond3了b、cond2为假,那还得判断cond3fork调⽤的⼀个奇妙之处在于它仅仅被调⽤⼀次,却能够返回两次,它可能有三种不同的返回值:1、在⽗进程中,fork返回新创建⼦进程的进程ID;2、在⼦进程中,fork返回0;3、如果出现错误,fork返回⼀个负值(题⼲中说明了不⽤考虑这种情况)在fork函数执⾏完毕后,如果创建新进程成功,则出现两个进程,⼀个是⼦进程,⼀个是⽗进程。

深入解析父子线程(父子线程相互独立,子线程使用自己的栈空间,进程要等到所有线程终止运行之后。。。

深入解析父子线程(父子线程相互独立,子线程使用自己的栈空间,进程要等到所有线程终止运行之后。。。

深⼊解析⽗⼦线程(⽗⼦线程相互独⽴,⼦线程使⽤⾃⼰的栈空间,进程要等到所有线程终⽌运⾏之后。

说起多线程,我们可以说起⼀⼤堆和它相关的有趣话题来,⽐如什么⼦孙线程关系,⽗⼦线程关系,线程同步异步之类的研究话题来,⽽我今天所说的,是关于⽗⼦线程的⼀些有趣现象。

⾸先提出⼀个问题,“在多线程的应⽤程序中,当⽗线程结束之后,⼦线程会不会退出呢?”,本⽂将围绕这个问题,深⼊分析windows中⽗⼦线程的⽣命周期及他们之间的关系。

我们知道,不管你使⽤的是何种编程语⾔,但当我们在windows下编程,且使⽤了平台相关性的库的时候,不管我们使⽤什么函数来创建线程,最终的结果是,我们的代码中都会调⽤CreateThread来创建线程,当然,这个⼯作是由你所使⽤的库封装完成的,你可以不⽤关⼼它是如何⼯作的。

⽽在线程的使命完成之后,必须结束的时候,我们的代码中⼜会调⽤ExitThread或是TeriminateThread来终⽌线程运⾏,其中,前⼀个函数⼀般⽤来终⽌⾃⼰,后⼀个函数可以终⽌任何线程,⼤多被⽤来终⽌其它线程。

在《Windows 核⼼编程》中告诉我们,⼀般情况下,尽量让线程⾃⼰返回⽽不要使⽤ExitThread或是TeriminateThread来强制终⽌线程,也不要让包含线程的进程在线程结束前就终⽌的⽅式来结束线程。

为啥呢?⼀般情况下,对于线程函数的正常返回,这才是最好的处理⽅式,线程函数正常返回,会处理下⾯4件事情:1.线程函数中创建的所有C++对象都通过其析构函数被正常析构。

2.操作系统正确释放线程栈使⽤的内存。

3.操作系统把线程的退出代码设为线程函数的返回值。

4.系统减少线程内核对象的使⽤计数。

在线程终⽌的时候,会处理下⾯⼏件事情:1.线程拥有的所有⽤户对象句柄会被释放。

在Windows中,⼤多对象都是包含了“创建这些对象的线程”的进程拥有。

但⼀个线程有2个⽤户对象:窗⼝和钩⼦。

⼀个线程终⽌时,系统会⾃动销毁由线程创建或安装的任何窗⼝,并卸载由线程创建或安装的任何钩⼦。

操作系统原理试卷

操作系统原理试卷

操作系统原理试卷1、父进程创建子进程之后,父子进程间的关系是什么?答案:一个进程创建子进程之后,进程与产生的进程之间的关系是父子关系,分别成为进程和子进程。

子进程一经产生就与你进程并发执行,子进程共享父进程和子进程。

子进程一经产生就与你进程并发执行,子进程共享父进程的正文段和已经打开的文件。

2、简述文件、文件系统的概念答案:文件是具有符号名的、在逻辑上具有完整意义的一组相关信息项的有序序列。

文件系统就是操作系统中实现文件统一管理的一组软件、被管理的的文件以及为实施文件管理所需的一些数据结构的总称。

3、简述作业调度的主要算法答案:作业调度的主要算法包括先来先服务调度算法,短作业优先调度算法,优先级调度算法和高响应比调度算法。

4、简述请求分页存储管理方式中三种内存分配策略的原理答案:固定分配局部置换为每个进程分配一组固定数目的物理块,在进程运行期间物理块数保持不变,当发生缺页中断且需要进行页面置换时,从自己进程的物理块中选择一个页面换出;可变分配全局置换,是先为每个进程分配一定数量的物理块,系统留空闲物理块,当发生缺页中断时,先从空闲物理块中选择空闲空间进行调入页面,当无空闲空间时,从所有内存中选择一个页面进行置换,此种方式会使发生缺页中断的进程物理块数增加,而调出页面的进程物理块数减少;可变分配局部置换,先为进程分配一定数量的物理块,系统预留空闲物理块,当进程发生缺页中断且需要进行页面置换时,从自己的物理块中选择页面换出,只有当某个进程的缺页率上升时,系统增加该进程的物理块数,反之,减少进程分配的物理块数。

5、简述段页式存储管理方式答案:段页式存储管理方式是对用户的逻辑地址空间先分段,再对每段划分成大小相等的页,而内存地址空间会按照页面大小划分成大小相等的物理块,段页式存储管理方式每个用户的进程会具有一张段表和一组页表。

6、简述有哪些程序链接方式答案:程序的链接方式主要包括静态链接、装入时动态链接、运行时动态链接7、简述什么是快表以及快表的作用答案:基本的地址变换机构需要两次访问内存才能够访问到数据。

操作系统习题(附参考答案)

操作系统习题(附参考答案)

操作系统习题(附参考答案)一、单选题(共100题,每题1分,共100分)1、下列存储器中,速度最快的是()。

A、内存B、寄存器C、CacheD、磁盘正确答案:B2、时钟中断事件属于()中断事件。

A、程序B、自愿性C、外部D、输入/输出正确答案:C3、可变分区存储管理系统中,若采用最佳适应分配算法,“空闲区表”中的空闲区可按()顺序排列。

A、大小从大到小B、大小从小到大C、地址从大到小D、地址从小到大正确答案:B4、从静态的角度看,下列选项中哪一个是进程必须拥有而程序所没有的?()A、常量数据B、全局变量C、进程控制块D、代码正文正确答案:C5、()不是管程的组成部分。

A、对局部于管程内的数据结构设置初始值的语句B、对管程内数据结构进行操作的一组过程C、局部于管程的共享数据结构D、管程外过程调用管程内数据结构的说明正确答案:D6、下列关于父进程和子进程的叙述中,正确的是()。

A、子进程执行完了,父进程才能执行B、父进程创建了子进程,因此父进程执行完了,子进程才能执行C、撤销子进程时,应该同时撤销父进程D、撤销父进程时,应该同时撤销子进程正确答案:D7、某计算机系统中有8台打印机,有K个进程竞争使用,每个进程最多需要3台打印机。

该系统可能会发生死锁的K的最小值是()。

A、3B、4C、2D、5正确答案:B8、分页虚拟存储管理系统中,若采用FIFO页面置换算法,则当分配的物理页面数增加时,缺页中断的次数()。

A、减少B、可能增加也可能减少C、增加D、不变正确答案:B9、产生内存抖动的主要原因是()。

A、内存空间太小B、CPU运行速度太慢C、CPU调度算法不合理D、页面置换算法不合理正确答案:D10、()存储管理兼顾了段式在逻辑上清晰和页式在存储管理上方便的优点。

A、分页B、段页式C、可变分区D、分段正确答案:B11、发生死锁的必要条件有四个,要预防死锁的发生,可以破坏这四个必要条件,但破坏()条件是不太实际的。

进程管理实验报告分析(3篇)

进程管理实验报告分析(3篇)

第1篇一、实验背景进程管理是操作系统中的一个重要组成部分,它负责管理计算机系统中所有进程的创建、调度、同步、通信和终止等操作。

为了加深对进程管理的理解,我们进行了一系列实验,以下是对实验的分析和总结。

二、实验目的1. 加深对进程概念的理解,明确进程和程序的区别。

2. 进一步认识并发执行的实质。

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

4. 了解Linux系统中进程通信的基本原理。

三、实验内容1. 使用系统调用fork()创建两个子进程,父进程和子进程分别显示不同的字符。

2. 修改程序,使每个进程循环显示一句话。

3. 使用signal()捕捉键盘中断信号,并通过kill()向子进程发送信号,实现进程的终止。

4. 分析利用软中断通信实现进程同步的机理。

四、实验结果与分析1. 实验一:父进程和子进程分别显示不同的字符在实验一中,我们使用fork()创建了一个父进程和两个子进程。

在父进程中,我们打印了字符'a',而在两个子进程中,我们分别打印了字符'b'和字符'c'。

实验结果显示,父进程和子进程的打印顺序是不确定的,这是因为进程的并发执行。

2. 实验二:每个进程循环显示一句话在实验二中,我们修改了程序,使每个进程循环显示一句话。

实验结果显示,父进程和子进程的打印顺序仍然是随机的。

这是因为并发执行的进程可能会同时占用CPU,导致打印顺序的不确定性。

3. 实验三:使用signal()捕捉键盘中断信号,并通过kill()向子进程发送信号在实验三中,我们使用signal()捕捉键盘中断信号(按c键),然后通过kill()向两个子进程发送信号,实现进程的终止。

实验结果显示,当按下c键时,两个子进程被终止,而父进程继续执行。

这表明signal()和kill()在进程控制方面具有重要作用。

4. 实验四:分析利用软中断通信实现进程同步的机理在实验四中,我们分析了利用软中断通信实现进程同步的机理。

子进程结束后返回原路径

子进程结束后返回原路径1.引言1.1 概述子进程的创建和结束是操作系统中的一个重要概念。

在计算机程序中,子进程是通过父进程创建出来的,子进程执行完任务后可能会返回到父进程原先所在的路径。

本文将重点探讨子进程结束后如何返回到原路径的问题。

在操作系统中,进程是指正在执行的程序实例。

每个进程都有自己的执行空间、堆栈和状态。

父进程可以通过创建子进程来完成并行处理等任务。

子进程可以继承父进程的一些资源和状态,也可以有自己独立的变量和代码段。

当子进程执行完任务后,有时候需要返回到父进程原先所在的路径。

这种需求在某些场景下非常常见,比如在父子进程之间进行数据传递或者协同工作时,子进程执行完任务后需要返回到父进程原来的操作路径。

为了实现子进程结束后返回原路径,可以使用一些技术手段。

其中一种常用的方法是通过进程间通信进行协调。

父进程可以在创建子进程前保存自己的路径信息,并在子进程执行完任务后,通过进程间通信将路径信息传递给子进程。

子进程收到路径信息后,可以通过一些系统调用或命令来切换到指定路径。

另一种方法是通过获取父进程的路径信息来完成返回操作。

子进程可以通过一些系统调用或命令获取父进程的路径信息,并在任务执行完毕后使用该路径信息来返回到原路径。

总之,子进程结束后返回原路径是一个重要的问题,对于父子进程之间的协同工作和数据传递具有重要意义。

本文将在接下来的章节中详细讨论子进程的创建和结束,以及子进程结束后如何返回原路径的具体方法和技巧。

1.2文章结构文章结构是指文章的章节组织和部分之间的逻辑连贯性。

在本文中,我们将通过以下章节来组织和展示我们的内容:1. 引言1.1 概述1.2 文章结构1.3 目的2. 正文2.1 子进程的创建和结束2.2 子进程结束后的返回路径3. 结论3.1 总结3.2 后续研究方向通过以上章节的结构,我们将全面地讨论子进程结束后如何返回原路径的问题。

首先,我们会在引言部分对本文的背景和问题进行概述,然后介绍文章的结构和目的,以便读者能够更好地理解本文的内容。

父进程和子进程

⽗进程和⼦进程⽗进程在计算机领域,⽗进程(英语:Parent Process)指已创建⼀个或多个⼦进程的进程。

UNIX在UNIX⾥,除了进程0(即PID=0的交换进程,Swapper Process)以外的所有进程都是由其他进程使⽤系统调⽤fork创建的,这⾥调⽤fork 创建新进程的进程即为⽗进程,⽽相对应的为其创建出的进程则为⼦进程,因⽽除了进程0以外的进程都只有⼀个⽗进程,但⼀个进程可以有多个⼦进程。

操作系统内核以进程标识符(Process Identifier,即PID)来识别进程。

进程0是系统引导时创建的⼀个特殊进程,在其调⽤fork创建出⼀个⼦进程(即PID=1的进程1,⼜称init)后,进程0就转为交换进程(有时也被称为空闲进程),⽽进程1(init进程)就是系统⾥其他所有进程的祖先。

僵⼫进程与孤⼉进程当⼀个⼦进程结束运⾏(⼀般是调⽤exit、运⾏时发⽣致命错误或收到终⽌信号所导致)时,⼦进程的退出状态(返回值)会回报给操作系统,系统则以SIGCHLD信号将⼦进程被结束的事件告知⽗进程,此时⼦进程的进程控制块(PCB)仍驻留在内存中。

⼀般来说,收到SIGCHLD后,⽗进程会使⽤wait系统调⽤以获取⼦进程的退出状态,然后内核就可以从内存中释放已结束的⼦进程的PCB;⽽如若⽗进程没有这么做的话,⼦进程的PCB就会⼀直驻留在内存中,也即成为僵⼫进程。

孤⼉进程则是指⽗进程结束后仍在运⾏的⼦进程。

在类UNIX系统中,孤⼉进程⼀般会被init进程所“收养”,成为init的⼦进程。

为避免产⽣僵⼫进程,实际应⽤中⼀般采取的⽅式是:1. 将⽗进程中对SIGCHLD信号的处理函数设为SIG_IGN(忽略信号);2. fork两次并杀死⼀级⼦进程,令⼆级⼦进程成为孤⼉进程⽽被init所“收养”、清理。

Linux在Linux内核中,进程和POSIX线程有着相当微⼩的区别,⽗进程的定义也与UNIX不尽相同。

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

父子进程的说法

父子进程的说法
"父子进程"是指在操作系统中,由一个进程创建(通常是通过fork系统调用)的进程关系。

这种关系通常用于实现并发执行或并行计算,允许父进程和子进程在独立的执行空间中运行。

以下是关于父子进程的一些说明:
1.父进程:执行fork系统调用的进程称为父进程。

父进程在创建子进程后,通常会继续执行一些任务,或者等待子进程完成执行。

2.子进程:通过fork系统调用创建的新进程称为子进程。

子进程是父进程的副本,拥有独立的内存空间,但通常会继承父进程的代码段、数据段、文件描述符等信息。

3.进程独立性:父进程和子进程之间是相对独立的,它们可以并发执行,互不影响。

子进程的修改通常不会影响父进程,反之亦然。

4.通信机制:父子进程之间可以通过进程间通信(Inter-Process Communication,IPC)来进行数据交换。

常见的IPC方法包括管道、共享内存、消息队列等。

5.等待子进程:父进程通常会使用wait系统调用等待子进程的结束,并获取子进程的退出状态。

这样可以确保父进程在子进程执行完毕后进行进一步的处理。

在多进程的环境中,父子进程的概念非常重要,它们共同构成了并发执行的基础。

在Unix/Linux等操作系统中,fork系统调用是实现多进程的一种常见方式。

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