进程控制

进程控制

Unix提供了大量的从C程序中操作进程的系统调用。

进程的创建和终止

程序总是处于下面三种状态之一:

  • 运行:进程要么在CPU上执行,要么在等待被执行且最终会被内核调度。
  • 停止:进程的执行被挂起,且不会被调度。当收到SIGSTOP、SIGTSTP、SIGTTIN或者SIGTTOU信号时,进程就停止,并且保持停止直到它收到一个SIGCONT信号,这时进程才再次开始运行。(信号是一种软中断)
  • 终止:进程永远的停了。

引起进程终止的事件:
- 正常结束:进程任务已经完成,准备退出运行。
- 异常结束:越界错、进程试图访问一个不允许访问的资源或文件、非法指令、使用了特权指令、执行时间超过了指定的最大值、等待某事件的时间超过了规定的最大值、算术运算错(除0错)、I/O故障。
- 外部干预:进程应外界请求尔终止。操作员终止、父进程请求结束子进程、因父进程终止子进程也终止了。

导致进程终止的三个原因:

  • 收到一个信号,该信号的默认行为是终止进程。
  • 从主程序返回
  • 调用exit()函数

进程的终止过程:

  • 根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读取该进程状态。
  • 若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度。
  • 若进程还有子孙进程,还应将其子孙进程都予以终止,以防成为不可控进程。
  • 将被终止进程所拥有的全部资源或者归还给父进程或者给OS。
  • 将被终止进程从所在队列中移出,等待其他程序来搜集信息。
#include<stdlib.h>
Void exit(int status);
//exit函数以status退出状态来终止进程。
#include<sys/types.h>
#include<unistd.h>
pid_t fork(void);

fork获得的子进程可以得到与父进程用户级虚拟地址空间相同的一份副本(独立的),包括代码和数据段、堆、共享库以及用户栈。子进程还获得与父进程任何打开文件描述符相同的副本,意味着子进程可以读写父进程中打开的任何文件。

fork函数要注意以下几点:
- 调用一次,返回两次。
- 并发执行。
- 相同但是独立的地址空间。
- 共享文件。

回收子进程

一各进程由于某种原因终止时,内核并不是立即把它从系统中清除。相反,进程被保持在一种已经终止的状态中,直到被回收。当父进程回收已终止的子进程时,内核将子进程的退出状态传递给父进程,然后抛弃已经终止的进程。

僵死进程:一个终止了但还未被回收的进程。
孤儿进程:父进程先于子进程终止。

如果一个父进程终止了,内核会安排init进程成为它的孤儿进程的养父。init进程时系统启动时内核创建的,他不会终止,是所有进程的祖先。如果父进程没有回收它的僵死进程就终止了,那么内核会安排init进程区回收。

#include<sys/types.h>
#include<sys/wait.h>
pid_t waitpid(pid_t pid, int *statusp, int options);
//1.pid的值:
// (1) pid > 0等待一个单独子进程,进程ID等于pid
// (2) pid = -1 等待父进程的所有子进程

//2.修改默认行为
//WNOHANG:如果等待集合钟的任何子进程还没终止,那么立即返回。默认行为是挂起调用进程,直到有子进程终止。
//WUNTRACED:挂起调用进程,直到有子进程终止或停止。返回的PID为导致返回的已终止或被停止的子进程PID。默认行为是返回已终止的子进程PID。
//WCONTINUED:挂起调用进程,直到有正在运行的子进程终止或一个被停止的进程收到SIGCONT信号重新开始执行
//WNOHANG|WUNTRACED:立即返回,如果等待集合钟的子进程没有被停止或终止,则返回0;若有一个停止或终止返回PID。
//3.检查已回收子进程的退出状态存在statusp中。
//4.如果调用进程没有子进程,返回-1,errno为ECHILD。如果函数被信号中断返回-1,errno为EINTR。

execve函数组

#Include<unistd.h>
int execbe(const char*filename, const char* argv[], const char* envp[]);

execve调用一次并从不返回。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值