新进程和程序-轻松实现高速串行io--fpga应用设计者指南

时间:2024-06-29 04:49:05
【文件属性】:

文件名称:新进程和程序-轻松实现高速串行io--fpga应用设计者指南

文件大小:3.09MB

文件格式:PDF

更新时间:2024-06-29 04:49:05

UNIX 系统 内幕 pdf

2.8 新进程和程序 UNIX 是一个多道程序环境,系统中任何时刻都有若干进程活动。在某一时刻进程运行 一 单一程序,许多程序可以并发的运行同一程序。这些进程共享内存程序正文的单一副本,但 每个进程有自己单独的数据和堆栈区。而且一个进程在任何时刻可以执行新的程序,并可以 在它的整个生命周期中运行几个程序。由此 UNIX 将进程和其运行的程序严格地区分开来。 为了支持这样的环境,UNIX 提供了几个系统调用创建和终止进程,以及执行新程序。 fork 和 vfork 系统调用创建新进程,exec 调用执行一个新程序。exit 系统调用终止进程。 注意进程也可因收到信号而终止。 2.8.1 fork 和 exec fork 系统调用创建一个新进程。调用 fork 的进程称为父进程,新进程是子进程,父子 关系构成了如图 2-4 所示的进程层次结构。子进程几乎就是父进程的完全复制。它的地址空 间是父进程的的复制,开始也运行的是同一程序。实际上,子进程是从 fork 返回开始用户 态执行的。 由于父进程和子进程都是从 fork 返回并继续执行同一程序,需要一种方式区分它们, 并使它们能照此运行。否则,不同进程将不可能做不同事。出于这种考虑,fork 系统调用 为父子进程返回不同的值——子进程中 fork 返回 0,父进程中返回子进程的 PID。 许多情况下,子进程从 fork 返回后很快会调用 exec 来开始执行新程序。(库函数提供 几种不同形式的 exec,如 exece,execve 和 execvp。每个使用一组稍有不同的参数,预处 理后调用同一系统调用。这个一般名称 exec 可指代这组函数中的任一函数。下面例子 2-2 中就是 fork 和 exec 的常用组合。 实例 2-2 使用 fork 和 exec if((result = fork()) == 0){ /* child code */ if(execv(”new_program”,⋯)< 0) perror("execve failed"); exit(1); }else if(result < 0){ perror(”fork”); /* fork failed */ ) /* parentt continues here */ ... 由于 exec 用新程序覆盖已有的进程,子进程不会返回旧程序.除非 exec 失败。exec 调 用成功后,子进程的地址空间替换为新程序的地址空间,子进程返回后程序计数器中将是新 程序的第一条可执行指令。 由于 fork 和 exec 经常被组合使用,有人会考虑是否使用一个系统调用来完成两个任 务,创建一个执行新程序的新进程。较早的 UNIX 系统[Thom 78]为子进程复制父进程地址空 间也造成很大负担(在 fork 执行时),而子进程却仅仅将其遗弃,并替换为新进程。 分开这两个调用有很多好处。在许多客户-服务器应用中.服务器程序可能会 fork 许多


网友评论