本篇文章给大家谈谈用c语言统计进程打开文件句柄,以及查看进程文件句柄数对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、如何查看LINUX单进程能够打开的最大文件句柄数2、c语言如何获得当前运行的控制台程序的句柄3、用VC++编写程序,像任务管理器那样获得某个进程的句柄数,和线程数4、C语言中如何获得当前进程句柄,谢谢!5、文件句柄统计
如何查看LINUX单进程能够打开的最大文件句柄数
在Linux下,我们使用ulimit -n 命令可以看到单个进程能够打开的最大文件句柄数量(socket连接也算在里面)。系统默认值1024。
对于一般的应用来说(象Apache、系统进程)1024完全足够使用。但是如何象squid、mysql、java等单进程处理大量请求的应用来说就有 点捉襟见肘了。如果单个进程打开的文件句柄数量超过了系统定义的值,就会提到“too many files open”的错误提示。如何知道当前进程打开了多少个文件句柄呢?下面一段小脚本可以帮你查看:
lsof -n |awk ‘{print $2}’|sort|uniq -c |sort -nr|more
在系统访问高峰时间以root用户执行上面的脚本,可能出现的结果如下:
# lsof -n|awk ‘{print $2}’|sort|uniq -c |sort -nr|more
131 24204
57 24244
57 24231
56 24264
其中第一行是打开的文件句柄数量,第二行是进程号。得到进程号后,我们可以通过ps命令得到进程的详细内容。
ps -aef |grep 24204
mysql 24204 24162 99 16:15 ? 00:24:25 /usr/sbin/mysqld
哦,原来是mysql进程打开最多文件句柄数量。但是他目前只打开了131个文件句柄数量,远远底于系统默认值1024。
但是如果系统并发特别大,尤其是squid服务器,很有可能会超过1024。这时候就必须要调整系统参数,以适应应用变化。Linux有硬性限制和软性限制。可以通过ulimit来设定这两个参数。方法如下,以root用户运行以下命令:
ulimit -HSn 4096
以上命令中,H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量。个人觉得最好不要超过4096,毕竟打开的文件句柄 数越多响应时间肯定会越慢。设定句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,可以修改.bash_profile文件,可以修改 /etc/profile 把上面命令加到最后。
c语言如何获得当前运行的控制台程序的句柄
句柄(HANDLE)是WINDOWS环境下特有的窗口程序运行的识别号,而C语言是DOS环境下运行的代码,在DOS环境下,没有句柄的概念,理论上说,新时期环境下的新产物,不可能在旧环境下找到,就像要求达尔文用电子邮件给出版社发送文稿一样荒诞不经,即使在控制台上运行的C程序可以通过WINDOWS任务管理器看到PID,但每次运行都不相同,那么有如何使用呢?
用VC++编写程序,像任务管理器那样获得某个进程的句柄数,和线程数
VC 获取进程线程数
#include tlhelp32.h
void EnumProcess(void)
{
HANDLE hProcessSnap;
HANDLE hProcess;
PROCESSENTRY32 pe32;
DWORD dwPriorityClass;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
return;
}
pe32.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hProcessSnap, pe32))
{
CloseHandle(hProcessSnap);
return;
}
do
{
//printf(“%s”, pe32.szExeFile); //完整文件名
//printf(“%d”, (int)pe32.cntThreads);//线程数
}while(Process32Next(hProcessSnap, pe32));
CloseHandle(hProcessSnap);
}
如果要获取进程句柄
HANDLE hProcessHandle;
hProcessHandle = OpenProcess(0x1F0FFF, true, ProcessID);//ProcessID进程ID
这个在控制台,Win32 SDK ,MFC 都可以用的,只不过
SDK ,MFC 输出就 不用 printf 了,只要把获取的内容赋给变量就行了
C语言中如何获得当前进程句柄,谢谢!
DWORD PID;
PID = GetProcessPID(L”test.exe”);
//获取进程pid函数
DWORD GetProcessPID(LPCTSTR pName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot) {
return NULL;
}
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL fOk;
for (fOk = Process32First(hSnapshot, pe); fOk; fOk = Process32Next(hSnapshot, pe)){
if (!_tcsicmp(pe.szExeFile, pName)) {
CloseHandle(hSnapshot);
return pe.th32ProcessID;
}
}
return NULL;
}
//由进程pid获取进程句柄,置顶
HWND hh = GetProcessTopWindows(PID);
HWND GetProcessTopWindows(DWORD dwPID){
count = 0;
EnumWindows((WNDENUMPROC)EnumWndProc, (LPARAM)dwPID);
if(count 0) {
//cout “窗口句柄是:” nhWnd[count -1] endl;//输出句柄,可用spy++工具核对
return (nhWnd[count -1]);
}
return NULL;
}
别忘了添加对应头文件。
文件句柄统计
# 统计指定用户指定进程号打开的文件句柄数
# lsof -u root -p 123|wc -l
# 输出所有打开的文件句柄信息
# lsof -u root socket.log.2021080918
time_suffix=`date +”%Y%m%d%H%M”`
# 输出所有打开的文件句柄信息
lsof -u root socket.log.$time_suffix
# 输出进程号
cat socket.log.$time_suffix|awk -F’ admin’ ‘{print $1}’|awk -F’python’ ‘{print $2}’ pid.log.$time_suffix
# 去除空格
sed -i “s/ //g” pid.log.$time_suffix
# 统计打开文件数最多的进程号
cat pid.log.$time_suffix |awk ‘BEGIN{FS=”\n”}{for(i=1;i=NF;i++){a[$i]++}}END{for(i in a){print i,a[i]}}’ |sort -n -t ” ” -k 2 -r|head -n 10
用c语言统计进程打开文件句柄的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于查看进程文件句柄数、用c语言统计进程打开文件句柄的信息别忘了在本站进行查找喔。