`
memorymyann
  • 浏览: 270760 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

wait4的使用

阅读更多

wait4会挂起当前进程,等待指定的子进程状态改变,并且会返回关于子进程使用资源的信息。所谓的状态的改变包括终止,挂起所有的进程状态的改变。
其次,在linux中进程终止后不会释放其资源,它会进入一种僵死的状态,内核会为僵死态的进程保留最少的信息(进程标识,终止状态和资源使用信息).而wait4就可以释放与子进程关联的资源。如果父进程不执行wait,而父进程又死亡后,僵死态的子进程会被指定成系统初始化进程init的子进程.下面是wait4使用方法:
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>
pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);
pid是要关注的子进程的pid(进程标识号)
status子进程的返回状态。
options进程等待选项
rusage死亡进程资源使用记录

pid这个很好理解,进程标识号,也是你ps -le显示出来的pid。如果指定了pid则会在指定pid发生变化后唤醒父进程,此外还有一下4种情况:
< -1   which means to wait for any child process whose process group ID is equal to the absolute value of pid.
-1     which means to wait for any child process; this is equivalent to calling wait3.
0      which means to wait for any child process whose process group ID is equal to that of the calling process.
> 0    which means to wait for the child whose process ID is equal to the value of pid.

status子进程的返回状态,这是个用于描述进程返回状态的整数,有各种宏操作可以查看,如下:
WIFEXITED(status)
    is non-zero if the child exited normally.

WEXITSTATUS(status)
    evaluates  to the least significant eight bits of the return code of the child which terminated, which may have been set as the argument to a call
to exit() or as the argument for a return statement in the main program.  This macro can only be evaluated if WIFEXITED returned non-zero.

WIFSIGNALED(status)
    returns true if the child process exited because of a signal which was not caught.

WTERMSIG(status)
    returns the number of the signal that caused the child process to terminate. This macro can only be evaluated if WIFSIGNALED returned non-zero.

WIFSTOPPED(status)
    returns true if the child process which caused the return is currently stopped; this is only possible if the call was done using WUNTRACED.

WSTOPSIG(status)
    returns the number of the signal which caused the child to stop.  This macro can only be evaluated if WIFSTOPPED returned non-zero.

options进程等待选项,当为WNOHANG表示立即返回,而当WUNTRACED表示等子进程状态发生变化后才返回。

最后rusage记录死亡进程资源使用信息,这个数据结构定义如下:
struct rusage {
    struct timeval ru_utime; /* user time used */
    struct timeval ru_stime; /* system time used */
    long   ru_maxrss;        /* maximum resident set size */
    long   ru_ixrss;         /* integral shared memory size */
    long   ru_idrss;         /* integral unshared data size */
    long   ru_isrss;         /* integral unshared stack size */
    long   ru_minflt;        /* page reclaims */
    long   ru_majflt;        /* page faults */
    long   ru_nswap;         /* swaps */
    long   ru_inblock;       /* block input operations */
    long   ru_oublock;       /* block output operations */
    long   ru_msgsnd;        /* messages sent */
    long   ru_msgrcv;        /* messages received */
    long   ru_nsignals;      /* signals received */
    long   ru_nvcsw;         /* voluntary context switches */
    long   ru_nivcsw;        /* involuntary context switches */
};

使用样例
[root@liumengli wait]# cat print.c
#include "stdio.h"

int main() {
        int i;
        for (i = 0; i < 50; i++)
                printf("Hello, This is print!!!\n");
        exit(0);
}
[root@liumengli wait]# gcc print.c -o print
[root@liumengli wait]# cat test_wait.c
#include "stdio.h"
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>

int main() {
        int child;
        int * status;
        struct rusage  * rus;
        char * argu[] = {"/program/wait/print", NULL};
        if(!(child = vfork())) {
                execve("/program/wait/print", argu, NULL);
        } else {
                wait4(child,status,WUNTRACED,rus);
                printf("The son's pid:%d, status:%d, The memory is:%d\n", child, WIFEXITED(status),rus->ru_nswap);
        }
        exit(0);
}
[root@liumengli wait]# gcc test_wait.c -o test_wait
[root@liumengli wait]# ./test_wait
Hello, This is print!!!
Hello, This is print!!!
Hello, This is print!!!
Hello, This is print!!!
.......
Hello, This is print!!!
Hello, This is print!!!
Hello, This is print!!!
Hello, This is print!!!
The son's pid:3237, status:0, The memory is:-1996293951
[root@liumengli wait]#

分享到:
评论

相关推荐

    CLOSE_WAIT网络连接无法释放问题解决

    4. 使用netstat -na命令查看TCP连接状态 5. 编程的重要性在于确保正确关闭连接 延伸阅读: * CLOSE_WAIT状态的详细解释 * TCP连接的结束流程详解 * 使用netstat命令查看TCP连接状态 *编程注意事项:正确关闭连接

    wait()编程wait()编程wait()编程wait()编程

    本文将深入探讨`wait()`方法的工作原理、使用场景以及注意事项。 `wait()`方法的主要功能是让当前线程进入等待状态,释放它所持有的锁资源,直到其他线程调用同一对象的`notify()`或`notifyAll()`方法唤醒该线程。...

    CentOS解决服务器存在大量time_wait的问题

    在IT行业中,服务器性能优化是至关重要的,尤其是对于运行关键应用如Tomcat的服务器。...同时,优化网络架构,如使用连接池,或者调整应用程序的行为,例如减少短连接的使用,也可以作为解决问题的补充策略。

    CLOSE_WAIT错误详解

    4. **使用Keepalive机制**:启用TCP Keepalive选项,周期性发送探测报文,以便在无数据交换的情况下检测连接是否还活跃,从而及时关闭无效连接。 在实际应用中,CLOSE_WAIT错误可能会导致服务器性能下降,甚至完全...

    oraclev$sessionv$session_wait用途详解

    4. **资源使用情况**:`v$session`还提供了会话使用的资源统计,如CPU时间、逻辑读取次数等,这些信息对于识别资源消耗大的会话非常有用。 ### `v$session_wait` 视图 `v$session_wait`视图则专注于展示会话的等待...

    信号pthread_cond_wait

    接下来,我们将详细探讨`pthread_cond_wait`的工作原理、使用方法以及在实际编程中的应用。 一、`pthread_cond_wait`的基本概念 `pthread_cond_wait`函数是线程阻塞和恢复的桥梁,它结合了条件变量(condition ...

    大量TIME_WAIT状态的连接解决方法

    4. **缩短TIME_WAIT超时时间**:减少TIME_WAIT状态的持续时间有助于缓解该状态的连接积压。通过修改`net.ipv4.tcp_fin_timeout`参数,可以调整TIME_WAIT状态的默认超时时间。 ```bash ...

    PyPI 官网下载 | wait4it-0.2.1-py3-none-any.whl

    标题中的"PyPI 官网下载 | wait4it-0.2.1-py3-none-any.whl"表明我们讨论的是一个在Python Package Index (PyPI)上发布的名为`wait4it`的软件包,其版本号为0.2.1。PyPI是Python开发者发布和分享自己编写的第三方...

    oracle中UPDATE nowait 的使用方法介绍

    1. **`UPDATE NOWAIT`的基本使用** 当你在执行`UPDATE`语句时加上`NOWAIT`选项,Oracle会尝试更新指定的行。如果这行数据当前已被其他事务锁定,`UPDATE NOWAIT`将不会阻塞并等待锁的释放,而是立即抛出一个`ORA-...

    关于释放time_wait连接多的方案

    ### 4. 调整FIN等待时间 `net.ipv4.tcp_fin_timeout=30` TCP_FIN_TIMEOUT参数定义了TIME_WAIT状态的持续时间,默认为60秒。将其缩短至30秒可以更快地释放TIME_WAIT状态的连接,但这也意味着任何潜在的网络延迟...

    Waitqueue、Event及Semaphore的实现机制分析

    例如,可以使用`__WAITQUEUE_INITIALIZER()`宏来静态初始化`wait_queue_t`,或者使用`DECLARE_WAITQUEUE()`来声明一个等待队列项。对于`wait_queue_head_t`,静态定义使用`__WAIT_QUEUE_HEAD_INITIALIZER()`,动态...

    前端开源库-wait-for-event

    如果是使用npm,可以通过`npm install wait-for-event`命令安装,然后通过`require('wait-for-event')`或`import waitForEvent from 'wait-for-event'`引入;如果是在HTML文件中,可以使用CDN链接或者下载库文件后...

    netstat显示 TIME-WAIT 的原因及解决办法

    4. **使用更快的协议**:如HTTP/2或QUIC等协议,它们支持多路复用,能在单个连接上处理多个请求,减少了对新连接的需求。 总的来说,理解TCP的TIME_WAIT状态及其影响对于网络性能优化至关重要。通过适当的配置调整...

    Iowait 的成因、对系统影响及对策

    这个文件包含了关于系统CPU使用情况的各种统计信息。`vmstat` 命令会读取 `/proc/stat` 中的数据,并计算出iowait时间。在内核中,`proc_misc.c` 文件负责输出 `/proc/stat` 的内容,其中包含了一个循环,用于累加每...

    MySQL wait_timeout连接超时

    4. **连接池管理**:对于大型应用,通常会使用连接池(如HikariCP、C3P0或Apache DBCP)来管理数据库连接。连接池可以自动检测并回收超时的连接,同时提供新的连接给应用使用。确保正确配置连接池的超时和验证设置至...

    close_wait_0306 close_wait_0306 close_wait_0306 close_wait_0306

    4. 使用工具检测:使用网络监控工具(如tcpdump、Wireshark)来追踪连接状态。 总的来说,`CLOSE_WAIT`状态是一个重要的网络编程和系统管理问题,需要细致的分析和适当的策略来解决。通过对问题的深入理解和相关...

    stop and wait

    4. **错误检测与重传**:如果接收方发现分组有误,或者没有按序到达,它不会发送ACK,而是忽略或丢弃。发送方在超时未收到ACK时,会重传该分组,确保数据的可靠性。 5. **效率问题**:由于每次发送后都需要等待确认...

Global site tag (gtag.js) - Google Analytics