函数waitpid和WTERMSIG说明(转)】的更多相关文章

waitpid系统调用在Linux函数库中的原型是: #include <sys/types.h> #include <sys/wait.h> pid_t waitpid(pid_t pid,int *status,int options) 从本质上讲,系统调用waitpid和wait的作用是完全相同的,但waitpid多出了两个可由用户控制的参数pid和options,从而为我们编程提供了另一种更灵活的方式.下面我们就来详细介绍一下这两个参数: pid>0时,只等待进程ID…
函数wait 一个进程在终止时会关闭所有文件描述符,释放在用户空间释放的内存,但它的PCB还保留着,内核在其中保存一些信息:如果是正常终止时则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个,这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除这个进程,我们知道一个进程的退出状态可以在shell用特殊变量$?查看,因为shell是它的父进程,当它终止时shell调用wait或waitpid得到它的退出状态同时彻底清除这个进程. 1. 函数wait:一次只能回…
第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. 2.void perror(const char *s) 该函数基于当前的errno值,在标准出错文件中输出一条出错消息,然后返回.声明在stdio.h文件中.它首先输出由s指向的字符串,然后是一个冒号,一个空格,接着是errno值对应的出错信息,最后是一个换行符. 第2章 UNIX标准化及实现…
僵尸进程 在介绍wait.waitpid和waitid函数之前,首先要介绍一下僵尸进程,因为,这三个函数的本质任务就是处理僵尸进程的问题. 进程会我们的生命体一样,也有消亡.进程在退出时,内核会清理进程几乎所有的资源.例如:内存资源.文件资源.信号量资源.共享内存资源或者引用数减一 又或释放共享内存资源.但还有少量的资源没有被内核清理,例如:进程控制块PCB task_struct.内核栈资源.这些资源没有被释放,是为了保留一些进程退出是的重要信息,例如:进程消耗的系统cpu时间.用户cpu时间…
僵尸进程 当一个子进程先于父进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行,或者父进程调用了wait才告终止. 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态. 进程表中代表子进程的数据项是不会立刻释放的,虽然不再活跃了,可子进程还停留在系统里,因为它的退出码还需要保存起来以备父进程中后续的wait调用使用.它将称为一个“僵进程”. 如何避免僵尸进程 调用wait或者waitpid函数查询子进程…
forc-and-exec流程 父进程与子进程之间的关系十分复杂,最大的复杂点在于进程间相互调用.Linux下这一流程称为fork-and-exec.父进程通过fork的方式产生一个一模一样的子进程,然后被复制出来的子进程再以exec的方式来执行实际要进行的进程,最终成为一个子进程的存在.整个流程如下 API解释 fork 原型 #include <unistd.h> pid_t fork(void); 功能 从调用该函数的进程复制出子进程,被复制的进程则被称为父进程,复制出来的进程称为子进程…
1.TCP/IP协议的体系结构包含四层:应用层(负责应用程序的网络服务,通过端口号识别各个不同的进程)->传输层(传输控制层协议TCP.用户数据报协议UDP.互联网控制消息协议ICMP)->网络层->网络接口层(负责将二进制流转换成数据帧,并进行数据帧的发送和接收)->硬件层. 2.服务器是指能在网络上提供服务的任何程序:客户机是指用户为了得到某种服务所需运行的应用程序. 3.网络通信即为进程间的通信,套接口就是网络进程的ID.使用端口号和网络地址的组合能够唯一确定整个网路中的一个…
1 僵尸进程 2 信号处理 信号: 1 由一进程发往另一进程 2 由内核发往某进程   僵尸状态: 父进程取回子进程的相关信息,进程的ID,终止状态,子进程的资源利用信息   编程时: 1 当派生子进程时,必须捕获信号SIGCHLD 2 当捕获信号时,必须处理被中断的系统调用 3 SIGCHLD的信号处理程序必须正确编写,使用函数waitpid以免留下僵尸进程   int main(int argc,char **argv){ int listenfd,connfd; pid_t childpi…
1.C++实现ls命令 #include<dirent.h> #include<stdlib.h> #include<iostream> #include "apue.h" using namespace std; int main(int argc,char * argv[]){ DIR *d struct dirent *dirp; if(argc!=2){ cout<<"usage: ls directory_name&q…
进程是操作系统分配资源的基本单位.线程是操作系统进行运行和调度的基本单位. 进程之间可以切换,以便轮流占用CPU,实现并发.一般进程运行在用户模式下,只能执行指令集中的部分指令. 当进程进行上下文切换的时候,需要从用户模式转变为内核模式. 用户模式转为内核模式的方法有系统调用(异常),中断,故障.下面一个一个解释: 系统调用(在CS:APP这本书里,系统调用是异常的一种):实际上是一种代理请求的方式,是进程申请使用操作系统提供的服务程序来完成工作.一些常用的系统调用函数有fork,sleep,r…