linux wait 和waitpid

背景:在读unix网络编程卷1, 第五章服务器处理SIGCHLD信号时。及多个客户端同时关闭socket连接,服务端主进程的多个子进程几乎同时结束。

使用wait 的情况:

void sig_chld(int signo)
{
    pid_t pid;
    int stat;
    pid = wait(&stat);
    return;
}

当服务端采用并发处理客户端的请求时,客户进程关闭连接,服务端子进程几乎同时结束,信号处理函数在使用wait时,并不能完全的防止僵尸进程的出现,问题在于,信号处理函数在处理第一个进程的SIGCHLD信号时,后面的四个进程也发来了SIGCHLD信号,但是信号是不排队的,这样就会导致信号丢失,这样会产生很多的僵尸进程。书中的解决办法是采用waitpid 循环判断。

采用waitpid:

void sig_chld(int signo)
{
       pid_t   pid;
       int     stat;

       while((pid = waitpid(-1, &stat, WNOHANG)) > 0){
               printf("child %d terminated\n", pid);
       }
        return;
}

看到这段代码,开始陷入了困惑,在sig_chld执行期间,后面的信号不也被忽略了吗? 为什么能防止僵尸进程?  其实不是这样的,waitpid 当第一个参数为-1 时,表示等待任何子进程,参数WNOHANG表示非阻塞wait。该函数循环等待所有的子进程,man手册的关于该函数的返回值也讲的很清楚,如果成功,返回子进程的id。当指定了WNOHANG 并且有一个或者多个子进程仍然存在,并且进程状态没有改变,即返回0. 因此sig_chld只要触发了,就会一直循环,直到所有的子进程都被处理。

时间: 2024-08-10 15:10:36

linux wait 和waitpid的相关文章

Linux环境编程--waitpid与fork与execlp

waitpid waitpid(等待子进程中断或结束) 表头文件 #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t waitpid(pid_t pid,int * status,int options); 函数说明 waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程 结束.如果在调用 wait()时子进程已经结束,则 wait()会立即 返回子进程结束状态值. 子进程的结束状态值会由参数 status 返回,

linux c学习笔记----进程创建(fork,wait,waitpid)

1.pid_t fork(); (1)当一个进程调用了fork 以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程ID 和父进程ID,其他的都是一样.就象符进程克隆(clone)自己一样. (2)为了区分父进程和子进程,我们必须跟踪fork 的返回值. 当fork 掉用失败的时候(内存不足或者是用户的最大进程数已到)fork 返回-1,否则fork 的返回值有重要的作用.对于父进程fork 返回子进程的ID,而对于fork 子进程返回0.我 们就是根据这个返回值来区分父子进程的

Linux系统开发 4 进程资源 环境 fork()子进程 wait() waitpid()僵尸 孤儿进程

<大纲> Linux系统编程 进程资源上限 进程环境变量 进程获取/修改环境变量 创建子进程fork() 最大进程数测试 程序的设置用户ID/组ID/黏住位 exec簇函数,执行程序覆盖堆栈 fork 与execl函数在一起 exec() 与主程序同一个PCB 僵尸进程 wait()回收僵尸进程 证明:父子进程同组pid waitpid() 非阻塞等待子线程发生变化 孤儿进程演示[父进程已经结束,子进程还在运行] 进程资源上限值 [email protected]:~$ cat /proc/s

【转】linux : waitpid函数

原文网址:http://blog.csdn.net/jifengszf/article/details/3067841 [waitpid系统调用]       功能描述: 等待进程改变其状态.所有下面哪些调用都被用于等待子进程状态的改 变,获取状态已改变的子进程信息.状态改变可被认为是:1.子进程已终止.2.信号导致子进程停止执行.3.信号恢复子进程的执行.在子进程终止的情况 下,wait调用将允许系统释放与子进程关联的资源.如果不执行wait,终止了的子进程会停留在"zombie"状

Linux网络编程wait()和waitpid()的讲解

本文讲的是关于wait和waitpid两者的区别与联系.为避免僵尸进程的产生,无论我们什么时候创建子进程时,主进程都需要等待子进程返回,以便对子进程进行清理.为此,我们在服务器程序中添加SIGCHLD信号处理函数. 客户端断开连接后,服务器端存在大量僵尸进程.这是由于服务器子进程终止后,发送SIGCHLD信号给父进程,而父进程默认忽略了该信号.为避免僵尸进程的产生,无论我们什么时候创建子进程时,主进程都需要等待子进程返回,以便对子进程进行清理.为此,我们在服务器程序中添加SIGCHLD信号处理函

linux中waitpid及wait的用法【转】

wait(等待子进程中断或结束) 表头文件 #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t wait (int * status); 函数说明: wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束. 如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值. 子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回. 如果不在意结束状态值,则参数 statu

linux 进程等待 wait 、 waitpid

waitpid() 与 wait() 功能相似,都是用户主进程等待子进程结束或中断. 可用于进程之间的同步 wait 函数原型 pid_t wait(int *status); 函数说明 wait() 会临时停止眼下进程的运行,直到有信号来到或子进程结束.假设在调用wait() 时子进程已经结束,则 wait() 会立即返回子进程结束状态值.子进程的结束状态值会由參数 status 返回,而子进程的进程识别码也会一块返回.假设不在意结束状态值,则參数ststus能够设为 NULL.子进程的结束状

linux下使用fork,exec,waitpid模拟system函数

代码如下: #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <errno.h> #include <stdlib.h> inline int mySystem(const char *cmd) { pid_t pid; if(cmd == NULL) return 1; int status; if

【转】linux中waitpid及wait的用法

原文网址:http://www.2cto.com/os/201203/124851.html wait(等待子进程中断或结束) 表头文件 #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t wait (int * status); 函数说明: wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束. 如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值. 子进程的结束状态值会由参数 s