进程控制
来源:互联网 发布:资本流入本币升值知乎 编辑:程序博客网 时间:2024/05/29 03:43
进程控制
Unix提供了大量的从C程序中操作进程的系统调用。
进程的创建和终止
程序总是处于下面三种状态之一:
- 运行:进程要么在CPU上执行,要么在等待被执行且最终会被内核调度。
- 停止:进程的执行被挂起,且不会被调度。当收到SIGSTOP、SIGTSTP、SIGTTIN或者SIGTTOU信号时,进程就停止,并且保持停止直到它收到一个SIGCONT信号,这时进程才再次开始运行。(信号是一种软中断)
- 终止:进程永远的停了。
导致进程终止的三个原因:
- 收到一个信号,该信号的默认行为是终止进程。
- 从主程序返回
- 调用exit()函数
#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调用一次并从不返回。
阅读全文