进程分析

一, 进程的终止

1, 有8种方式使进程终止,

其中5种为正常终止, 他们是
1, 从main返回
2, 调用exit()
3, 调用_exit()或者_Exit();
4, 最后一个线程从其启动列程返回
5, 从最后一个线程调用pthread_exit()

异常终止有3种方式, 他们是
6, 调用abort
7, 接到一个信号
8, 最后一个线程对取消请求做出响应

2, 函数setjmp和longjmp函数的使用与goto区别

1,goto 只能在函数体重使用
2, setjmp, longjmp 可以使用在不同的函数体使用———–栈帧中跳转
函数原型:

#include <setjmp.h>
void longjmp(jmp_buf env, int val);
void siglongjmp(sigjmp_buf env, int val);
3, 进程标识符

系统中有一些专用的进程,但具体细节因实现而异。
1, ID为0的进程通常是调度进程, 常常被 称为交换进程(swapper)。
该进程是内核的一部分, 它井不执行任何磁盘上的程序,因此也被 称为系统进程。
2, 进程ID 1通常是init进程,在自举过程结束时由内核调用。
该进程的程序文件 在UNIX的早期版本中是/etc/init, 在较新版本中是/sbin/ini口此进程负责在自举内核
后启动一个UNIX系统。in红通常读与系统有关的初始化文件(/etc/re*文件或/etc/
ini巨ab文件,以及/etc/init.d中的文件),井将系统引导到一个状态(例如多用户)。
init进程决不会终止。它是一个普通的用户进程(与交换进程不同,它不是内核中的系统进程),
但是它以超级用户特权运行。

init如何成为所有孤儿进程的父进程

4, 文件共享

在重定向父进程的标准输出时,子进程的标准输出也被 重定向。
实际上,fork的一个特性是父进程的所有打开文件描述符都被复制到子进程中。父、
子进程的每个相同的打开描述符共享一个文件表项。

考虑下述情况,一个进程具有三个不同的打开文件,它们是标准输入、标准输出和标准出
错。在从fork返回时,我们有了如图8-1中所示的结构。
这种共享文件的方式使父、子进程对同一文件使用了一个文件偏移量。考虑下述情况: 一
个进程fork了一个子进程,然后等待子进程终止。假定,作为普通处理的一部分,父、子进
程都向标准输出进行写操作。如果父进程的标准输出己重定向(很可能是由shell实现的),那
么子进程写到该标准输出时,它将更新与父进程共享的该文件的偏移量。在我们所考虑的例子
中,当父进程等待子进程时,子进程写到标准输出,而在子进程终止后,父进程也写到标准输
出上,井且知道其输出会添加在子进程所写数据之后。如果父、子进程不共享同一文件偏移量,
臣这种形式的交互就很难实现。
如果父、子进程写到同一描述符文件,但又没有任何形式的同步(例如使父进程等待子进
程),那么它们的输出就会相互混合(假定所用的描述符是在fork之前打开的)。虽然这种情
况是可能发生的, 但这井不是常用的操作模式。

在fork之后处理文件描述符有两种常见的情况:
(1)父进程等待子进程完成。在这种情况下,父进程无需对其描述符做任何处理。当子进
程终止后,它曾进行过读、写操作的任一共享描述符的文件偏移量已执行了相应更新。

(2)父、子进程各自执行不同的程序段。在这种情况下,在fork之后,父、子进程各自关
闭它们不需使用的文件描述符,这样就不会干扰对方使用的文件描述符。这种方法是网络服务
进程中经常使用的。

5, 除了打开文件之外, 父进程的很多其他属性也由子进程继承, 包括

·实际用户ID 、实际组ID、有效用户ID 、有效组ID。
·附加组ID。臣丑
·进程组1D。
·会话ID。
·控制终端。
·设置用户ID标志和设置组ID标志。
• 当前工作目录。
·根目录。
·文件模式创建屏蔽字。
·信号屏蔽和安排。
·针对任一打开文件描述符的在执行时关闭(close-on-exec)标志。
·环境。
·连接的共享存储段。
·存储映射。
·资源限制。
父子进程之间的区别是:
• fork的返回值。
·进程ID不同。
·两个进程具有不同的父进程ID: 子进程的父进程ID是创建它的进程的ID, 而父进程的父
进程ID则不变。
·子进程的tms_utime、tms_stime、tms_cutime以及tms_ustime均被设置为0。
父进程设优的文件锁不会被子进程继承。
·子进程的未处理的闹钟(alarm)被清除。
·子进程的未处理信号集设置为空集。
其中很多特性至今尚未讨论过, 我们将在以后几章中对它们进行说明。
使fork失败的两个主要原因是: 系统中已经有了太多的进程(通常意味着某个方面出了
问题), 或者该实际用户ID的进程总数超过了系统限制。回忆表2-10, 其中CHILD_MAX规定了
每个实际用户ID在任一时刻可具有的最大进程数。

fork有下面两种用法:
(1) 一个父进程希望复制自己, 使父、子进程同时执行不同的代码段。这在网络服务进程
中是常见的— —父进程等待客户端的服务请求。当这种请求到达时, 父进程调用fork, 使子
进程处理此请求。父进程则继续等待下一个服务请求到达。

(2) 一个进程要执行一个不同的程序。这对shell是常见的情况。在这种情况下, 子进程从
fork返回后立即调用exec。
某些操作系统将(2)中的两个操作(fork之后执行exec)组合成一个, 并称其为spawn。
UNIX将这两个操作分开, 因为在很多场合需要单独使用fork, 其后并不跟随exec。另外,
将这两个操作分开, 使得子进程在fork和exec之间可以更改自己的属性。例如1/0重定向、用
户ID、信号安排等。

6, wait和waitpid的说明
#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *status);

pid_t waitpid(pid_t pid, int *status, int options);

int waitid(idtype_t idtype, id_t id,  siginfo_t  *infop,
int options);


检查邓it和waitpid所返回的终止状态的宏

1, WIFEXITED (status) 若为正常终止子进程返回的状态, 则为真。
对千这种情况可执行WEXITSTATUS (status), 取子进程传送给exit()、_exit或_Exit参数的低8位

2, WIFSIGNALED (status) 若为异常终止子进程返回的状态, 则为真(接到一个不捕捉的信号)。
对千这种情况, 可执行WTERMSIG (status), 取使子进程终止的信号编号。另外, 有些
实现(非Single UNIX Specification)定义宏WCOREDUMP (status) , 若已产生终
止进程的core文件, 则它返回真

3, WIFSTOPPED (status) 若为当前暂停子进程的返回的状态, 则为真。
对千这种情况, 可执行WSTOPSIG (status), 取使子进程暂停的信号编号

4, WIFCONTINUED (status) 若在作业控制暂停后已经继续的子进程返回了状态, 则为真。(POSIX.l的XSI
扩展,仅用千waitpid过。)

代码的分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值