- 浏览: 271044 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
AndMacLinuXp:
试了下,不错!
printk内核调试 -
klose:
我引用你的文章,并做了简单的分析:这里贴出url:http:/ ...
linux系统调用fork, vfork, clone -
klose:
你上面提到的问题:free的问题。首先你可能疏忽了,stack ...
linux系统调用fork, vfork, clone -
qwe_rt:
HI ,非常nice的文章,在阅读过程中,我发现我的ubunt ...
linux手动添加开机启动的服务 -
suifeng:
谢谢分享, 受用中.
shell编程分支,循环
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]#
发表评论
-
linux下挂在windows共享文件夹
2012-05-06 12:53 888smbmount //nas/xxxx /mnt/nas -o ... -
进程组 对话期
2010-04-16 16:12 1411为了便于进程控制,于是就有了进程组,对话期的概念。 进 ... -
感谢你教会我如何提问-《提问的智慧》
2009-01-12 11:25 1457转自:http://linux.chinaunix ... -
linux手动添加开机启动的服务
2009-01-02 14:48 7201如果你只是想知道如何 ... -
让信号量来实现临界区控制
2008-12-09 16:14 1604前面我们谈到过管道,消息队列。我们可以使用他们可以解决了2个进 ... -
进程通行之报文消息队列
2008-12-04 17:39 1419报文和消息队列又是进 ... -
信号和信号处理
2008-11-26 16:09 3346信号同样是用于进程通 ... -
命名管道实现样例
2008-11-18 17:41 1288[root@liumengli name_pipe]# mkn ... -
linux中的管道实现和管道
2008-11-14 17:52 12983inux的shell中有个很常用的东西管道,很多人认为他是sh ... -
文件访问权限和安全
2008-10-28 18:02 1242打开文件,读取内容或 ... -
printk内核调试
2008-10-15 17:07 9454首先阐明一点,我调试的目的是为了学习,看看内核代码是如何运行, ... -
linux内核编译
2008-10-07 17:36 1969这是调试linux内核的必要步骤,虽然很麻烦,而且容易出错(所 ... -
linux文件系统
2008-10-06 11:08 1020文件系统是一个比较模糊的名词,文件也是一个比较模糊的名词。狭义 ... -
linux内核书籍下载
2008-09-25 11:47 2194学习内核代码之前,需要有以下一些基础: 1.linux系统管理 ... -
nanosleep函数
2008-09-24 17:36 3381int nanosleep(const struct ti ... -
linux进程调度政策
2008-09-23 11:45 1593进程调度政策就是调度系统种哪一个进程来CPU运行。这种调度分2 ... -
linux进程调度发生的时机
2008-09-19 18:03 4135所谓调度时机就是:什么时候会发生进程调度。在linux中,进程 ... -
SSH远程启动服务的问题
2008-09-18 12:32 4722SSH是我们最长用的远程连接linux服务器的工具了,安全 ... -
时钟中断
2008-09-17 16:57 3372时钟中断:是指在计算 ... -
wait4的实现
2008-09-17 15:38 3015不贴实现的代码了,很 ...
相关推荐
4. 使用netstat -na命令查看TCP连接状态 5. 编程的重要性在于确保正确关闭连接 延伸阅读: * CLOSE_WAIT状态的详细解释 * TCP连接的结束流程详解 * 使用netstat命令查看TCP连接状态 *编程注意事项:正确关闭连接
本文将深入探讨`wait()`方法的工作原理、使用场景以及注意事项。 `wait()`方法的主要功能是让当前线程进入等待状态,释放它所持有的锁资源,直到其他线程调用同一对象的`notify()`或`notifyAll()`方法唤醒该线程。...
在IT行业中,服务器性能优化是至关重要的,尤其是对于运行关键应用如Tomcat的服务器。...同时,优化网络架构,如使用连接池,或者调整应用程序的行为,例如减少短连接的使用,也可以作为解决问题的补充策略。
4. **使用Keepalive机制**:启用TCP Keepalive选项,周期性发送探测报文,以便在无数据交换的情况下检测连接是否还活跃,从而及时关闭无效连接。 在实际应用中,CLOSE_WAIT错误可能会导致服务器性能下降,甚至完全...
4. **资源使用情况**:`v$session`还提供了会话使用的资源统计,如CPU时间、逻辑读取次数等,这些信息对于识别资源消耗大的会话非常有用。 ### `v$session_wait` 视图 `v$session_wait`视图则专注于展示会话的等待...
接下来,我们将详细探讨`pthread_cond_wait`的工作原理、使用方法以及在实际编程中的应用。 一、`pthread_cond_wait`的基本概念 `pthread_cond_wait`函数是线程阻塞和恢复的桥梁,它结合了条件变量(condition ...
4. **缩短TIME_WAIT超时时间**:减少TIME_WAIT状态的持续时间有助于缓解该状态的连接积压。通过修改`net.ipv4.tcp_fin_timeout`参数,可以调整TIME_WAIT状态的默认超时时间。 ```bash ...
标题中的"PyPI 官网下载 | wait4it-0.2.1-py3-none-any.whl"表明我们讨论的是一个在Python Package Index (PyPI)上发布的名为`wait4it`的软件包,其版本号为0.2.1。PyPI是Python开发者发布和分享自己编写的第三方...
1. **`UPDATE NOWAIT`的基本使用** 当你在执行`UPDATE`语句时加上`NOWAIT`选项,Oracle会尝试更新指定的行。如果这行数据当前已被其他事务锁定,`UPDATE NOWAIT`将不会阻塞并等待锁的释放,而是立即抛出一个`ORA-...
### 4. 调整FIN等待时间 `net.ipv4.tcp_fin_timeout=30` TCP_FIN_TIMEOUT参数定义了TIME_WAIT状态的持续时间,默认为60秒。将其缩短至30秒可以更快地释放TIME_WAIT状态的连接,但这也意味着任何潜在的网络延迟...
例如,可以使用`__WAITQUEUE_INITIALIZER()`宏来静态初始化`wait_queue_t`,或者使用`DECLARE_WAITQUEUE()`来声明一个等待队列项。对于`wait_queue_head_t`,静态定义使用`__WAIT_QUEUE_HEAD_INITIALIZER()`,动态...
如果是使用npm,可以通过`npm install wait-for-event`命令安装,然后通过`require('wait-for-event')`或`import waitForEvent from 'wait-for-event'`引入;如果是在HTML文件中,可以使用CDN链接或者下载库文件后...
4. **使用更快的协议**:如HTTP/2或QUIC等协议,它们支持多路复用,能在单个连接上处理多个请求,减少了对新连接的需求。 总的来说,理解TCP的TIME_WAIT状态及其影响对于网络性能优化至关重要。通过适当的配置调整...
这个文件包含了关于系统CPU使用情况的各种统计信息。`vmstat` 命令会读取 `/proc/stat` 中的数据,并计算出iowait时间。在内核中,`proc_misc.c` 文件负责输出 `/proc/stat` 的内容,其中包含了一个循环,用于累加每...
4. **连接池管理**:对于大型应用,通常会使用连接池(如HikariCP、C3P0或Apache DBCP)来管理数据库连接。连接池可以自动检测并回收超时的连接,同时提供新的连接给应用使用。确保正确配置连接池的超时和验证设置至...
4. 使用工具检测:使用网络监控工具(如tcpdump、Wireshark)来追踪连接状态。 总的来说,`CLOSE_WAIT`状态是一个重要的网络编程和系统管理问题,需要细致的分析和适当的策略来解决。通过对问题的深入理解和相关...
4. **错误检测与重传**:如果接收方发现分组有误,或者没有按序到达,它不会发送ACK,而是忽略或丢弃。发送方在超时未收到ACK时,会重传该分组,确保数据的可靠性。 5. **效率问题**:由于每次发送后都需要等待确认...