【APUE】wait与waitpid函数】的更多相关文章

当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号.因为子进程终止是个异步事件(这可以在父进程运行的任何时候发生),所以这种信号也是内核向父进程发的异步通知.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数(信号处理程序).对于这种信号的系统默认动作是忽略它). 调用wait或waitpid的进程可能会发生的情况: 如果其所有子进程都还在运行,则阻塞. 如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回. 如果它没有任何子进程,…
第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. 2.void perror(const char *s) 该函数基于当前的errno值,在标准出错文件中输出一条出错消息,然后返回.声明在stdio.h文件中.它首先输出由s指向的字符串,然后是一个冒号,一个空格,接着是errno值对应的出错信息,最后是一个换行符. 第2章 UNIX标准化及实现…
一.僵尸进程 当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态. A child that terminates, but has not been waited for becomes a "zombie".  The kernel maintains a  minimal set of…
Wait和waipid函数 当一个进程正常或异常终止的时候,内核就像其父进程发送SIGCHLD信号,因为子进程是个一步事件,所以这种信号也是内核系那个父进程发的异步通知.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数.对于这种信号的系统默认动作是忽略它. 现在要知道调用wait或waitpid的进程可能会发生什么情况: 如果其所有子进程都在运行,则阻塞. 如果一个子进程已经终止,正在得带的父进程获取到终止状态,则取得该子进程的终止状态立即返回. 如果他没有任何子进程,则立即…
关于Linux中waitpid函数的一些使用说明: #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t waitpid(pid_t pid,int * status,int options); waitpid函数有三个参数:pid和指向返回状态所在单元的指针和一个用来指定可选项的标识符.如果pid为-1 ,waitpid就等待任何一个子进程,如果pid>0 j就是等待pid指定的那个进程结束,参数pid还存在另外的两种可…
waitpid函数:作用同wait,但可指定pid进程清理,可以不阻塞. 原型:pid_t waitpid(pid_t pid, int *status, in options); 返回值:成功时返回清理掉的子进程ID,失败返回-1:当第三个参数被设置为WNOHANG,且子进程还在运行时,返回0: 参数说明: pid > 0 回收指定ID的子进程  . -1 回收任意子进程(相当于wait). 0 回收和当前调用waitpid一个组的所有子进程. < -1 回收指定进程组内的任意子进程. st…
lienhua342014-10-12 当一个进程正常或者异常终止时,内核就向其父进程发送 SIGCHLD信号.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用的函数(信号处理程序).对于这种信号的系统默认动作是忽略它. 在文档“进程控制三部曲”中,我们讲的第三部曲是使用 wait 函数来获取终止子进程的终止状态.那么,有几个问题我们这里需要详细的学习一下. 1. 父进程一定能够获取到子进程的终止状态吗?如果子进程在父进程调用 wait 函数前就终止了,怎么办? 2. 如果父进程没有获…
waitpid函数 作用同于wait,但可指定pid进程清理,可以不阻塞. pid_t waitpid(pid_t pid,int *status,int options);成功:返回清理掉的子进程ID:失败:-1(无子进程) 特殊参数和返回情况: 参数pid: >0 回收指定ID的子进程 -1 回收任意子进程(相当于wait) 0 回收和当前调用waitpid一个组的所有子进程 < -1 回收指定进程组内的任意子进程 返回0:参数3为WNOHANG,且子进程正在运行. 注意:一次wait或w…
本文内容: 1.僵尸进程,孤儿进程的定义,区别,产生原因,处理方法 2.wait函数,waitpid函数的分析,以及比较 背景:由于子进程的结束和父进程的运行是一个异步的过程,即父进程永远无法预测子进程什么时候结,所以就产生了孤儿进程和僵尸进程 定义: 孤儿进程:即父进程退出后,它的一个或多个子进程还在运行,那么这些子进程叫做孤儿进程 僵尸进程:如果子进程退出,但是父进程没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符pid仍然保存在系统中,那么该子进程叫做僵尸进程…
当子进程退出时,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程.它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态.父进程查询子进程的退出状态可以用wait/waitpid函数. wait函数: pid_t  wait(int  *status)  函数参数:status 该函数可以获得等待子进程的信息.返回值:子include<unistd.h> #include…
当使用fork创建多个进程后,需要解决子进程回收的问题.wait和waitpid函数就是做这个工作的. 假设子进程没有合理的回收,可能会带来两个问题: 1.孤儿进程(父进程挂了,子进程活着),孤儿进程会被init进程回收,可以理解其没有危害,不会占用资源. 2.僵尸进程(子进程挂了,父进程活着),僵尸进程是当父进程活着时,子进程没有其他进程帮忙回收后产生的"有害进程",所以僵尸必须要回收,否则僵尸进程太多了会占用系统资源.此时就需要用到wait或waitpid函数. wait和wait…
当一个进程终止时,内核就向其父进程发送SIGCHLD信号.因为子进程终止是个异步事件,所以这种信号也是内核向父进程发的异步通知.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数.对于这种信号的系统默认动作是忽略它. 调用wait或waitpid的进程发生的情况如下: 1.如果所有子进程都还在运行,则阻塞 2.如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回 3.如果它没有任何子进程,则立即出错返回 #include <sys/wait.h>…
#include <sys/types.h> /* 提供类型pid_t的定义 */ #include <sys/wait.h> pid_t wait(int *status) 进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回:如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止. 参数status用来保存被收集进程退出时…
转载自:http://blog.sina.com.cn/s/blog_7776b9d3010144f9.html 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程. 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程…… 一个进程在调用exit…
程序的启动与退出过程 先上图,了解进程运行的机制.     内核首先调用exec,运行C启动进程,C启动进程会调用main()函数.     其他所有函数都是由main函数直接或间接调用的.     从Figure7.2可以看出,内核与用户进程的交互,直接使用的只有三个函数:exec._exit._Exit     exec是用来启动C启动历程的,关于用户进程的退出,主要涉及以下三个函数: #include <stdlib.h> void exit(int status); //进行了进程的清…
本例中使用fork()创建一个子进程,然后让子进程暂停5s,接下来对原有的父进程使用waitpid()函数,利用WNOHANG使父进程不会阻塞每隔一秒判断子进程是否退出. #include"my.h" #include<stdio.h> #include<stdlib.h> int main(){ pid_t pid,ret; ){ perror("fork ERROR!"); ; }){ printf("%d:进程在运行\n&qu…
来源:http://hohahohayo.blog.163.com/blog/static/120816010200971210230362/ wait(等待子进程中断或结束)表头文件     #include<sys/types.h>     #include<sys/wait.h> 定义函数 pid_t wait (int * status); 函数说明:     wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束.      如果在调用 wait()时子进程已经…
原文网址:http://blog.csdn.net/jifengszf/article/details/3067841 [waitpid系统调用]       功能描述: 等待进程改变其状态.所有下面哪些调用都被用于等待子进程状态的改 变,获取状态已改变的子进程信息.状态改变可被认为是:1.子进程已终止.2.信号导致子进程停止执行.3.信号恢复子进程的执行.在子进程终止的情况 下,wait调用将允许系统释放与子进程关联的资源.如果不执行wait,终止了的子进程会停留在"zombie"状…
// 输出至标准出错文件的出错处理函数static void err_doit(int, int, const char *, va_list); /* * Nonfatal error related to a system call * Print a message and return */ void err_ret(const char *fmt, ...) { va_list ap; va_start(ap, fmt); err_doit(, errno, fmt, ap); va_…
今天看unix环境高级编程时,随着书上的源码打了一遍,编译时提示 toll函数未定义, 找了半天(恕我对上下文不了解).看了英文版和源代码文件才知道, 中文版打印错了: toll => atol 其实书中的错误地方不少.…
函数wait 一个进程在终止时会关闭所有文件描述符,释放在用户空间释放的内存,但它的PCB还保留着,内核在其中保存一些信息:如果是正常终止时则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个,这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除这个进程,我们知道一个进程的退出状态可以在shell用特殊变量$?查看,因为shell是它的父进程,当它终止时shell调用wait或waitpid得到它的退出状态同时彻底清除这个进程. 1. 函数wait:一次只能回…
wait和waitpid出现的原因 SIGCHLD --当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) --子进程退出时,内核将子进程置为僵尸状态,这个进程成为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态 --父进程查询子进程的退出状态可以用wait/waitpid函数 wait获取staus后检测处理 宏定义 描述 WIFEXITED(status) 如果进程子进程正常结束,返回一个非零值…
1.  wait()和waitpid()函数说明 wait() 进程一旦调用了wait(), 就立即阻塞自己,由wait自动分析是否有当前进程的某个子进程已经退出,如果让它找到了一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回:如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到一个子进程结束或者该进程接到了一个指定的信号为止. waitpid() waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如可提供一…
当Unix系统级函数遇到错误时,它们会典型地返回-1,并设置全局整数变量errno来表示什么出错了 阅读redis源码的时候,发现如果对系统级函数出错时的errno比较熟悉,写起程序来会游刃有余不少.所以,趁着学习APUE和CSAPP的时候,将自己遇到的常用系统级函数在出错时候返回的errno总结起来, 另外,C语言中文网 http://c.biancheng.net/ 中已经给出了很多系统级函数的错误代码总结,所以此文章主要会用于更新一些我用到过的,以及前述网站没有提到的函数错误代码.   1…
man wait: NAME wait, waitpid, waitid - wait for process to change state SYNOPSIS #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, sig…
之前在学习wait和waitpid函数的时候,就对使用宏WIFEXITED来检查获取的进程终止状态产生过疑惑:一般我们在程序中是调用的exit或者_exit函数来退出的,那么wait和waitpid函数获取的终止状态直接就是我们传递给exit的参数不就OK了吗? 后来了解到是我考虑简单了,因为程序退出不仅仅只有我们显示地调用exit这么简单,还会有异常退出等情况,本文就对wait函数获取的状态做个总结! 先来对wait status做个整体总结,一般我们通过wait status可以判定子进程发…
最近在看APUE第10章中关于system函数的POSIX.1的实现.关于POSIX.1要求system函数忽略SIGINT和SIGQUIT,并且阻塞信号SIGCHLD的论述,理解得不是很透彻,本文就通过实际的实例来一探究竟吧. 一.为什么要阻塞SIGCHLD信号 #include <stdlib.h> int system(const char *command); 函数工作大致流程:system()函数先fork一个子进程,在这个子进程中调用/bin/sh -c来执行command指定的命…
简介 本文总结了个人,一个数字,对应称号<APUE>第一版的每一章,但是,独立的二级标题和书,人需求进行编写. 3.文件I/O 本章所说明的函数常常被称之为不带缓存的I/O(与第5章中说明的标准I/O函数相对比) 3.1文件I/O函数 大多数UNIX文件I/O仅仅需用到5个函数:open.read.write.lseek.close. 需注意的是write后如须要read,则须要在read前加入lseek.由于write后文件的偏移量在write的最后一个位置(而该位置可能在文件尾). 3.2…
本篇主要介绍一下几个内容: 竞态条件(race condition) exec系函数 解释器文件    1 竞态条件(Race Condition) 竞态条件:当多个进程共同操作一个数据,并且结果依赖于各个进程的操作顺序时,就会发生竞态条件. 例如fork函数执行后,如果结果依赖于父子进程的执行顺序,则会发生竞态条件. 说到fork之后的父子进程的执行顺序,我们可以通过下面的方式指定执行顺序: 如果父进程等待子进程结束,则需要调用wait函数. 如果子进程等待父进程结束,则需要像下面这样轮询:…