`
gstarwd
  • 浏览: 1525699 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

fork和exec

阅读更多

许多朋友对fork和exec调用概念比较模糊,下面我简单描述下这方面的知识。
学过C语言的都知道,Unix下某个进程的内存分成三部分:代码段,堆栈段,数据段。代码段用来存放程序运行的代码,堆栈段用来存放子程序的局部变量,数据段用来存放全局变量。这在perl里也是一样的。
perl的fork调用,跟C的一样,当发生fork调用时,实际上发生如下事:
父进程将代码段,堆栈段,数据段完全复制一份给子进程。也就是说,在子进程运行之初,它拥有父进程的一切变量和句柄。例如,父进程申明了某个hash表,那这个hash表也会被子进程拥有。
然 而,一旦子进程开始运行,它的数据段和堆栈段就在内存里完全和父进程分离开了。也就是说,两个进程间不再共享任何数据。例如前面所说的hash表,虽然子 进程从父进程处继承了这个数据结构,但子进程写往hash里的数据,不会被父进程访问到。在shell里用ps命令,可以看到2个独立运行的进程。通常你 kill掉1个,不会影响另1个的运行。
那么父进程和fork出来的子进程如何通信呢?父进程和子进程间的通信有多种方法,最常见的是信号,另外还有管道,Socket,消息队列等,不在这里详叙。而2个进程间共享数据的办法,可以用线程或共享内存,我对这方面不熟悉。
如 果大概明白了fork,那么exec就容易理解了。一个进程一旦调用exec类函数,它本身就“死亡”了,系统把代码段替换成新的程序的代码,废弃原有的 数据段和堆栈段,并为新程序分配新的数据段与堆栈段,唯一留下的,就是进程号,也就是说,对系统而言,还是同一个进程,不过已经是另一个程序了。
在perl里,调用exec后,原进程就完全消失,由于消失了,它也就不会从新进程接受到任何返回值,除非新进程意外终止,原进程会接受到错误值。

 

fork 函数

exec 函数

文件描述符表

文件表

索引节点表

子进程复制文件描述符表

共享文件表、索引节点表

查看每个文件描述符表中的 close_on_exec 标志,若设置了该标志则关闭对应描述符,否则复制

实际用户、实际组

从父进程继承

保持不变

有效用户、有效组

从父进程继承

若执行文件的 set-uid 位设置,则设置成程序文件的用户 ID, 否则保持不变

保存的设置 - 用户 -ID 、设置 - -ID

从父进程继承

从上面已经分配的有效用户复制过来,也就是说若执行文件的 set-uid 为设置,则设置成程序文件的用户 ID ,否则复制有效用户。

添加组

从父进程继承

保持不变

对话期 ID 、进程组 ID 、控制终端

从父进程继承

保持不变

fsuid fsgid 文件有效用户 ID 、组 ID

(针对 linux 系统)

从已经被赋值的有效用户、有效组复制过来

从已经被赋值的有效用户、有效组复制过来

环境变量

从父进程继承,也可以在 main(argc,argv[][],env[][])

指定环境变量

保持不变,也可以在 execve(path[],argv[][],env[][])

指定环境变量

根目录、当前工作目录、文件创建屏蔽字

从父进程继承

保持不变

资源限制

从父进程继承

保持不变

系统执行时间

用户执行时间

清空

保持不变

阻塞信号集合

从父进程继承

保持不变

挂起信号集合

被清除

保持不变

信号处理方式

从父进程继承

对于设置了信号捕捉函数的信号的处理方式改为默认处理方式,其他信号的处理方式保持不变

使用资源( ??? 还有疑问)

清空

保持不变

父进程设置的锁(例如文件锁、互斥锁等)

不继承

保持不变

分享到:
评论

相关推荐

    20120618_启动新进程(fork和exec系列函数实现)1

    本文将深入探讨两个重要的函数,`fork()`和`exec()`系列函数,它们在启动新进程时起着至关重要的作用。 **一、复制进程映像:fork()函数** `fork()`函数是Unix和类Unix系统(如Linux)中用于创建新进程的关键系统...

    Linux下Fork与Exec使用

    - 在 Linux 环境下,`fork()` 和 `exec()` 等函数为多进程编程提供了强大的支持。通过合理地使用这些工具,开发人员可以构建出高效且可扩展的多进程应用程序。 - 理解进程的结构和控制方式对于高效地利用系统资源至...

    python基础教程:Python中的进程分支fork和exec详解

    掌握`fork()`和`exec`系列函数是理解和编写多进程Python程序的关键。在处理需要同时进行的异步任务,如后台服务、数据处理等场景时,这些工具非常有用。理解它们的工作原理和使用方法,能帮助开发者有效地利用系统...

    Python中的进程分支fork和exec详解

    Python中的进程分支主要涉及到两个核心概念:fork()和exec()。本文将详细讲解这两个概念在Python中的使用和它们之间的关系。 在Unix/Linux系统中,fork()方法用于创建一个与当前进程几乎完全相同的子进程。这个子...

    fork、exec系列与system、popen区别.rar_UNIX popen_linux system pop_pop

    在UNIX和Linux操作系统中,进程创建和控制是通过一系列系统调用来实现的,其中最常见的是`fork`、`exec`系列以及`system`和`popen`函数。这些调用各自有不同的特性和用途,理解它们的区别对于进行系统级编程至关重要...

    pp.rar_exec wait_fork and exec Shell_grep_open_unix pipe

    Unix课程作业。 使用fork(), exec(), dup2(), pipe() ,open()系统调用完成与下列shell命令等价的功能。 grep –v usr < /etc/passwd | wc –l > result.txt

    使用fork(),exec(),dup2(), pipe(),open()系统调用完成与shell命令等价的功能:grep -v usr result.txt

    使用fork(),exec(),dup2(), pipe(),open()系统调用完成与下列shell命令等价的功能:grep -v usr | wc -l > result.txt

    UNIX Linux实验教程 3实验三Linux进程管理与控制.doc

    * fork 和 exec 系统调用联合使用能为程序开发提供有力支持。 * 用 fork 建立子进程,然后在子进程中使用 exec,这样就实现了父进程与一个与它完全不同子进程的并发执行。 六、wait 和 exec 的联合使用 * wait 和 ...

    PB16030899 -朱河勤-csapp-shell-lab-report.pdf

    在实现外部命令时,我们需要使用fork和exec函数来创建一个新的进程来执行外部命令。同时,我们还需要使用wait函数来等待外部命令的执行结果。 此外,该shell程序还支持一些特色features,如支持多个空格、引号、...

    操作系统 linux下 fork exec wait 函数分析(课程设计)

    在操作系统领域,Linux环境下,`fork`、`exec`和`wait`是三个非常重要的系统调用,它们在进程管理中扮演着核心角色。本文将深入解析这些函数的工作原理及其在实际应用中的重要性。 首先,`fork()`函数是创建新进程...

    linux下用fork()函数实现多进程调用带来的一些思考

    `fork()`函数能够创建一个新的子进程,使得子进程与父进程共享代码段,但各自拥有独立的堆栈段和数据段。当`fork()`成功执行时,它在父进程中返回子进程的进程ID,在子进程中返回0。因此,父进程和子进程可以在不同...

    Linux 进程 总结

    创建新进程主要涉及fork和exec系列函数。fork创建子进程,子进程与父进程的主要区别在于pid、ppid和资源统计信息的初始化。Linux使用clone系统调用实现fork,其名称源于其使用写时拷贝(Copy-On-Write, COW)技术来...

    山大操作系统实验2.doc

    知识点 4: fork 和 exec 系统调用 fork 系统调用用于创建一个新的进程,该进程是当前进程的副本。exec 系统调用用于将一个新的程序加载到当前进程中,替代当前进程的正文段。 知识点 5: 进程同步和通信 进程同步...

    操作系统课程设计PPT学习教案.pptx

    在实验中,我们可以通过分析 Linux 的 fork 和 exec 等代码来了解操作系统进程的创建和执行过程。我们可以使用 `task_struct` 结构体来描述进程的状态,例如: ```c struct task_struct { volatile long state; /*...

    Unix-Linux编程实践教程(中文清晰带书签).pdf

    4. **进程管理**:掌握如何创建、控制和通信进程(如fork、exec、wait、pipe和socket等),是Unix/Linux编程的核心内容。 5. **系统调用**:如open、read、write、close用于文件操作,fork和exec用于进程创建,...

    《Linux程序设计权威指南》源代码.rar

    例如,你可能会看到如何使用fork和exec家族函数来实现进程间的通信,或者如何使用select或epoll来实现高效的网络服务器。 此外,源码中的注释和文档将帮助你理解作者的思路,学习如何编写清晰、可维护的代码。通过...

    《大学计算机基础》技能测试题2.pdf

    例如,在 Linux 操作系统中,进程可以通过 fork 和 exec 系统调用来创建和执行,而内存管理则可以通过分页和分段机制来实现。 最后,数据库管理系统是指管理和存储数据的系统软件,包括数据模型、数据库设计、...

    我的进程创建程序.rar_进程创建

    在Linux系统中,我们通常使用fork和exec系列函数来完成类似的操作。fork会创建一个与父进程几乎完全相同的子进程,而exec则会替换子进程的内存映像,使其执行新的程序。 在“www.pudn.com.txt”文件中,可能包含的...

    操作系统课程设计.doc

    学生需要编写程序,模拟用户通过命令行创建和管理进程,使用底层操作系统的API如fork和exec来创建和执行新进程。在进程撤消时,利用wait()系统调用来处理子进程的结束。此外,学生还需要对比分析模拟子系统与实际...

Global site tag (gtag.js) - Google Analytics