linux 监控类守护进程linux下的c语言编程监控部分代码

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
Linux下守护进程的C语言实现
摘要:=Start=缘由:以后可能要用C语言写一个daemon程序(守护进程)运行在服务器上,以进行一些信息收集的工作。之前只是简单知道什么是守护进程,但对于一些细节以及该如何编写都不太清楚,所以需要先学习、准备一下。正文:参考解答:守护进程(Daemon)是什么?守护进程,也即通常所说的Daemon进程,是Linux下一种特殊的后台服务进程,它独立于控制终端并且周期性的执行某种任务或者等待处理某些发生的事件。守护进程通常在系统引导装入时启动,在系统关闭时终止。Linux系统下大多
=Start= 缘由:
以后可能要用C语言写一个daemon程序(守护进程)运行在服务器上,以进行一些信息收集的工作。之前只是简单知道什么是守护进程,但对于一些细节以及该如何编写都不太清楚,所以需要先学习、准备一下。 正文: 参考解答: 守护进程(Daemon)是什么?
守护进程,也即通常所说的 Daemon 进程, 是 Linux 下一种特殊的后台服务进程,它独立于控制终端并且周期性的执行某种任务或者等待处理某些发生的事件。守护进程通常在系统引导装入时启动,在系统关闭时终止。Linux 系统下大多数服务都是通过守护进程实现的。守护进程的名称通常以 “d” 结尾,比如 “httpd”、“crond”、“mysqld” 等。
控制终端是什么?
终端是用户与操作系统进行交流的界面。 在 Linux 系统中,用户由终端登录系统登入系统后会得到一个 shell 进程,这个终端便成为这个 shell 进程的控制终端(Controlling Terminal)。 shell 进程启动的其他进程,由于复制了父进程的信息,因此也都同依附于这个控制终端。
从终端启动的进程都依附于该终端,并受终端控制和影响。终端关闭,相应的进程都会自动关闭。守护进程脱离终端的目的,也即是不受终端变化的影响不被终端打断,当然也不想在终端显示执行过程中的信息。如果不想进程受到用户、终端或其他变化的影响,就必须把它变成守护进程。
如何实现守护进程?
守护进程属于 Linux 进程管理的范畴。其首要的特性是后台运行;其次,要与从启动它的父进程的运行环境隔离开来,需要处理的内容大致包括会话、控制终端、进程组、文件描述符、文件权限掩码以及工作目录等。
守护进程可以在 Linux 启动时从脚本 /etc/rc.d 启动,也可以由作业规划进程 crond 启动,还可以通过用户终端(一般是 Shell)启动。
实现一个守护进程,其实就是将普通进程按照上述特性改造为守护进程的过程。需要注意的一点是,不同版本的 Unix 系统其实现机制不同,BSD 和 Linux 下的实现细节就不同。
根据上述的特性,我们便可以创建一个简单的守护进程,这里以 Linux 系统下从终端 Shell 来启动为例。
1、创建子进程,父进程退出
编写守护进程第一步,就是要使得进程独立于终端后台运行。为避免终端挂起,将父进程退出,造成程序已经退出的假象,所有后面的工作都在子进程完成,这样控制终端也可以继续执行其他命令,从而在形式上脱离控制终端的控制。
由于父进程先于子进程退出,子进程就变为孤儿进程,并由 init 进程作为其父进程收养。
2、子进程创建新会话
经过上一步,子进程已经后台运行,然而系统调用 fork 创建子进程,子进程便复制了原父进程的进程控制块(PCB),相应地继承了一些信息,包括会话、进程组、控制终端等信息。 尽管父进程已经退出,但子进程的会话、进程组、控制终端的信息没有改变。为使子进程完全摆脱父进程的环境,需要调用 setsid 函数。
这里有必要说一下两个概念:会话和进程组。
进程组:一个或多个进程的集合。拥有唯一的标识进程组 ID, 每个进程组都有一个组长进程,该进程的进程号等于其进程组的 ID。进程组 ID 不会因组长进程退出而受到影响,fork 调用也不会改变进程组 ID。
会话:一个或多个进程组的集合。 新建会话时,当前进程(会话中唯一的进程)成为会话首进程,也是当前进程组的组长进程,其进程号为会话 ID,同样也是该进程组的 ID。它通常是登录 shell,也可以是调用 setsid 新建会话的孤儿进程。 注意:组长进程调用 setsid ,则出错返回,无法新建会话。
通常,会话开始于用户登录,终止于用户退出,期间的所有进程都属于这个会话。一个会话一般包含一个会话首进程、一个前台进程组和一个后台进程组,控制终端可有可无;此外,前台进程组只有一个,后台进程组可以有多个,这些进程组共享一个控制终端。
前台进程组:该进程组中的进程可以向终端设备进行读、写操作(属于该组的进程可以从终端获得输入)。该进程组的 ID 等于控制终端进程组 ID,通常据此来判断前台进程组。
后台进程组:会话中除了会话首进程和前台进程组以外的所有进程,都属于后台进程组。该进程组中的进程只能向终端设备进行写操作。
会话(session):如果想了解更多关于会话(session)的内容,可以好好读一下 APUE 这本书。
如果调用进程非组长进程,那么就能创建一个新会话:
该进程变成新会话的首进程 该进程成为一个新进程组的组长进程 该进程没有控制终端,如果之前有,则会被中断(会话过程对控制终端的独占性)
也就是说: 组长进程不能成为新会话首进程,新会话首进程必定成为组长进程 。
到此为止,我们熟悉了会话与进程间的关系,那么如何新建一个会话呢?
通过调用 setsid 函数可以创建一个新会话,调用进程担任新会话的首进程,其作用有:
使当前进程 脱离原会话的控制 使当前进程 脱离原进程组的控制 使当前进程 脱离原控制终端的控制
这样,当前进程才能实现真正意义上完全独立出来,摆脱其他进程的控制。
另外,要提一下,尽管进程变成无终端的会话首进程,但是它仍然可以重新申请打开一个控制终端。可以通过再次创建子进程结束当前进程,使进程不再是会话首进程来禁止进程重新打开控制终端。 3、改变当前工作目录
直接调用 chdir 函数将切换到根目录下。
由于进程运行过程中,当前目录所在的文件系统(如:“/mnt/usb”)是不能卸载的,
为避免对以后的使用造成麻烦,改变工作目录为根目录是必要的。如有特殊需要,也可以改变到特定目录,如“/tmp”。 4、重设文件权限掩码
fork 函数创建的子进程,继承了父进程的文件操作权限, 为防止对以后使用文件带来问题,需要重设文件权限掩码。
文件权限掩码,设定了文件权限中要屏蔽掉的对应位。这个跟文件权限的八进制数字模式表示差不多,将现有存取权限减去权限掩码(或做异或运算),就可产生新建文件时的预设权限。
调用 umask 设置文件权限掩码,通常是重设为 0,清除掩码,这样可以大大增强守护进程的灵活性。 5、关闭无关文件描述符
同文件权限掩码一样,子进程可能继承了父进程打开的文件,而这些文件可能永远不会被用到,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下,因此需要一一关闭它们。由于守护进程脱离了终端运行,因此标准输入、标准输出、标准错误输出这3个文件描述符也要关闭。通常按如下方式来关闭: for (i=0; i & MAXFILE; i++)&&&&close(i);
这里要注意下,param.h 头文件中定义了一个常量 NOFILE,表示最大允许的文件描述符,但是我们尽量不要用它,而是通过调用函数 getdtablesize 返回进程文件描述符表中的项数(即打开的文件数目):
/* The following are not really correct but it is a value we used for a long time
and which seems to be usable. People should not use NOFILEand NCARGSanyway. */
#define NOFILE 256
#define NCARGS 131072
至此为止,一个简单的守护进程就建立起来了。
另外,有些 Unix 提供一个 daemon 的 C 库函数,实现守护进程。(BSD 和 Linux 均提供这个函数): NAME&&&&daemon - runin thebackgroundSYNOPSIS&&&&#include &unistd.h&&&&&int daemon(int nochdir, int noclose);DESCRIPTION&&&&Thedaemon() function is for programswishingto detachthemselvesfromthecontrollingterminaland runin thebackgroundas systemdaemons. 守护进程的示例代码 #include &stdio.h&#include &stdlib.h&#include &string.h&#include &time.h&#include &unistd.h&#include &sys/param.h&#include &sys/types.h&#include &sys/stat.h&#include &fcntl.h&&// 守护进程初始化函数void init_daemon(){&&&&pid_&&&&int i = 0;&&&&&if ((pid = fork()) == -1) {&&&&&&&&printf(&Fork error !/n&);&&&&&&&&exit(1);&&&&}&&&&if (pid != 0) {&&&&&&&&exit(0);&&&&&&&&// 父进程退出&&&&}&&&&&setsid();&&&&&&&&&&// 子进程开启新会话,并成为会话首进程和组长进程&&&&if ((pid = fork()) == -1) {&&&&&&&&printf(&Fork error !/n&);&&&&&&&&exit(-1);&&&&}&&&&if (pid != 0) {&&&&&&&&exit(0);&&&&&&&&// 结束第一子进程,第二子进程不再是会话首进程&&&&}&&&&chdir(&/tmp&);&&&&&&// 改变工作目录&&&&umask(0);&&&&&&&&&&// 重设文件掩码&&&&for (; i & getdtablesize(); ++i) {&&&&&&close(i);&&&&&&&&// 关闭打开的文件描述符&&&&}&&&&&}&int main(int argc, char *argv[]){&&&&&&&&time_&&&&char buf[] = {&This is a daemon:&&&};&&&&char *&&&&int len = 0;&&&&//printf(&The NOFILE is: %d/n&, NOFILE);&&&&//printf(&The tablesize is: %d/n&, getdtablesize());&&&&//printf(&The pid is: %d/n&, getpid());&&&&&// 初始化 Daemon 进程&&&&init_daemon();&&&&&// 每隔一分钟记录运行状态&&&&while (1) {&&&&&&&&if (-1 == (fp = open(&/tmp/daemon.log&, O_CREAT|O_WRONLY|O_APPEND, 0600))) {&&&&&&&&&&printf(&Open file error !/n&);&&&&&&&&&&exit(1);&&&&&&&&}&&&&&&&&len = strlen(buf);&&&&&&&&write(fp, buf, len);&&&&&&&&t = time(0);&&&&&&&&datetime = asctime(localtime(&;t));&&&&&&&&len = strlen(datetime);&&&&&&&&write(fp, datetime, len);&&&&&&&&close(fp);&&&&&&&&sleep(60);&&&&}&&&&&return 0;} 守护进程的正确性验证
编译代码: gcc -o firstdaemon daemonize.c
启动守护进程: ./firstdaemon
检查是否工作正常: ps -xj | grep firstdaemon
输出应该类似于: +------+------+------+------+-----+-------+------+------+------+-----+| PPID | PID&&| PGID | SID&&| TTY | TPGID | STAT | UID&&| TIME | CMD |+------+------+------+------+-----+-------+------+------+------+-----+|&&&&1 | 3387 | 3386 | 3386 | ?&&|&&&&-1 | S&&&&| 1000 | 0:00 | ./&&|+------+------+------+------+-----+-------+------+------+------+-----+
解释如下: 守护进程不应该有控制终端,所以(TTY = ?) 守护进程的父进程ID为1,即init进程 其中 PID != SID 表明该进程不是会话的leader进程,因为第二个fork()的作用 因为 PID != SID 所以该守护进程无法重新打开/控制一个TTY 参考链接: Linux 守护进程的实现 Creating a daemon in Linux linux下daemon守护进程的编写实例 Linux C创建守护进程(daemon)及终端相关概念 APUE
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
Linux下守护进程的C语言实现相关信息,包括
的信息,所有Linux下守护进程的C语言实现相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International如何在Linux下用c语言创建守护进程并监控系统运行期间的所有进程_百度知道
如何在Linux下用c语言创建守护进程并监控系统运行期间的所有进程
我有更好的答案
可以分三步来做:做两个简单的守护进程,并能正常运行监控进程是否在运行启动进程综合起来就可以了,代码如下:被监控进程thisisatest.c#include&unistd.h&#include&signal.h&#include&stdio.h&#include&stdlib.h&#include&sys/param.h&#include&sys/types.h&#include&sys/stat.h&#include&time.h&void init_daemon()
采纳率:96%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。如何在Linux下用c语言创建守护进程并监控系统运行期间的所有进程_百度知道
如何在Linux下用c语言创建守护进程并监控系统运行期间的所有进程
我有更好的答案
这跟execvp函数的实现方式有关:int execvp(const char *file ,char * const argv []);execvp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。之所以显示“fail to exec”,是因为在PATH环境变量所指的目录中没有名为“hello”的程序。建议进行如下操作:1、运行“echo $PATH”,查看一下PATH环境变量指向那些目录2、编写一个输出“hello world”的程序,并命名为hello,即执行命令:gcc -o hello hello.c3、把名为”hello“的程序拷贝到PATH变量所指的其中一个目录中
采纳率:94%
来自团队:
为您推荐:
其他类似问题
守护进程的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。博客分类:
#include &stdio.h&
#include &unistd.h&
#include &stdlib.h&
#include &sys/param.h&
#include &sys/stat.h&
#include &sys/types.h&
#include &fcntl.h&
#include &signal.h&
void my_daemon() {
// 1.转变为后台进程
if ((pid = fork()) == -1) exit(1);
if (pid != 0) exit(0); // 父进程(前台进程)退出
// 2.离开原先的进程组,会话
if (setsid() == -1) exit(1); // 开启一个新会话
// 3.禁止再次打开控制终端
if ((pid = fork()) == -1) exit(1);
if (pid != 0) exit(0); // 父进程(会话领头进程)退出
// 4.关闭打开的文件描述符,避免浪费系统资源
for (int i = 0; i & NOFILE; i++)
// 5.改变当前的工作目录,避免卸载不了文件系统
if (chdir("/") == -1) exit(1);
// 6.重设文件掩码,防止某些属性被父进程屏蔽
if (umask(0) == -1) exit(1);
// 7.重定向标准输入,输出,错误流,因为守护进程没有控制终端
if ((fd = open("/dev/null", O_RDWR)) == -1) exit(1); // 打开一个指向/dev/null的文件描述符
dup2(fd, STDIN_FILENO);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
close(fd);
// 8.本守护进程的子进程若不需要返回信息,那么交给init进程回收,避免产生僵尸进程
if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) exit(1);
#define INTERVAL 2
int main(int argc, char *argv[]) {
my_daemon(); // 首先使之成为守护进程
int t = 0;
FILE *fp = fopen("/root/tmp.txt", "a");
fprintf(fp, "ppid = %d, pid = %d, sid = %d, pgrp = %d\n", getppid(), getpid(), getsid(0), getpgrp());
fflush(fp);
do { // 测试此后台进程,每INTERVAL秒打印当前时间t,30秒后退出此后台进程
fprintf(fp, "%d\n", t);
fflush(fp); // 输出缓冲区内容到文件中
sleep(INTERVAL);
t += INTERVAL;
} while(t & 30);
fclose(fp);
保存为daemon.c
编译命令 gcc daemon.c
运行 ./a.out
查看tmp.txt文件内容 cat /root/tmp.txt
浏览: 111510 次
来自: 重庆
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Wingdows下各种类型的守护进程的写法_其它编程-织梦者
当前位置:&>&&>& > Wingdows下各种类型的守护进程的写法
Wingdows下各种类型的守护进程的写法
写一个C++程序,监控另一个进程,发现该进程关掉了就自动把它重启。
#include &iostream&
#include &.h&
#include &stdio.h&
#include &tchar.h&
int _tmain(int argc, TCHAR *argv[])
STARTUPINFO
PROCESS_INFORMATION //进程信息:
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
//创建子进程,判断是否执行成功
if(!CreateProcess( NULL,&cmd /c d://1.jpg&,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
cout && &创建进程失败..& && GetLastError() &&
system(&pause&); //用于测试
//进程执行成功,打印进程信息
cout && &以下是子进程的信息:& &&
cout && &进程ID pi.dwProcessID: & && pi.dwProcessId &&
cout && &线程ID pi.dwThreadID : & && pi.dwThreadId &&
//等待知道子进程退出...
WaitForSingleObject( pi.hProcess, INFINITE);//检测进程是否停止
//while (WAIT_TIMEOUT == WaitForSingleObject( pi.hProcess, 50)) //检测进程是否停止 (INFINITE)
////检查进程当前状态,返回0表示正在运行,返回非0,表示暂停
//if (0 != ResumeThread(pi.hProcess))
//WaitForSingleObject()函数检查对象的状态,如果是未确定的则等待至超时
//子进程退出
cout && &子进程已经退出...& &&
//关闭进程和句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
//system(&pause&);//执行完毕后等待
}while(true);//如果进程推出就再次执行方法
//GetThreadPriority(); //获得进程状态
//ResumeThread()
在程序中启动另外一个进程
#include &stdafx.h&
#include &iostream&
#include &windows.h&
#include &stdio.h&
#include &tchar.h&
#include &ShellAPI.h&
int _tmain(int argc, TCHAR *argv[])
//#include &ShellAPI.h&
//wchar_t lpFile[] = L&E://Test//Test.exe&;
SHELLEXECUTEINFO ExeI
ZeroMemory ( &ExeInfo, sizeof( SHELLEXECUTEINFO) );
ExeInfo.cbSize = sizeof( SHELLEXECUTEINFO );
ExeInfo.lpFile = L&E://Test//Test.exe&;
ExeInfo.lpDirectory = NULL;
ExeInfo.lpParameters = NULL;
ExeInfo.fMask = SEE_MASK_NOCLOSEPROCESS ;
ExeInfo.nShow = SW_MAXIMIZE;//SW_HIDE;
ShellExecuteEx ( &ExeInfo );
//this-&Enabled =
//catch (Exception &exception)
////this-&Enabled =
//Application-&ShowException(&exception);
//this-&Hide();
for ( ; ; )
//Application-&ProcessMessages();
if ( WAIT_TIMEOUT != WaitForSingleObject ( ExeInfo.hProcess, INFINITE ) )
//if ( g_blExit ) // Exit the Application
//this-&Show();
//this-&Enabled =
//this-&SetFocus();
//this-&BringToFront();
windows下监控进程的脚本
相信大家都有这样的需求,某程序(进程)在运行的时候可能挂掉,需要去监控该程序,并在它挂掉的时候重启之,确保该程序能一直运行。比如土net就经常挂,需要监控程序去监控。Linux下面似乎有守护进程的概念,Windows下面其实也很简单,dos批处理就可以搞定:-)
需要了解如下几个命令,tasklist + find,ping。tasklist是列出所有进程,可以指定只列出某用户的进程,用/FI参数过滤。find /C可以去tasklist的结果中查找指定进程名,并输出个数。
还有个问题是如何设置每隔一段时间去检测进程是否在运行,我用的是ping命令自带的延迟参数-w,将IP地址设置成一个空地址,比如0.0.0.1,这样该命令会一直ping,直到一定n*w毫秒后才返回(n和w分别是参数-n和-w指定的值)。
示例程序如下,红色部分需要根据需求进行替换,enjoy it!
tasklist /FI &username eqbigtree& | find /C &Java& & temp.txt
set /p num= & temp.txt
del /F temp.txt
echo %num%
if &%num%& == &0&
start /D &E:/User/bigtree/program/comparison/&pos
ping -n 10 -w .1& temp.txt
del /F temp.txt
goto RESTART
注意1:goto语句是将监控程序设置成死循环,哇咔咔。
注意2:可以用start /D path program去异步调用program程序,也就是不等program指定完毕就执行下面的语句,因此可以设置固定间隔(n*w毫秒)去监测。
如果用call program则是同步调用,会等待program执行完毕,这样延迟就用不着了。
最近几天加班加疯掉了,天天晚上没法睡。开发部的一个核心程序总是会自己宕机,然后需要手工去起,而这个服务的安全级别又很高,只有我可以操作,搞得我晚上老没法睡,昨晚实在受不了了,想起以前在hp-ux下写的shell守护进程,这回搞个windows下的bat版守护程序吧,当时晚上思路已经很迟钝了,就叫了个兄弟让他写了,上去后运行效果不错,至少昨晚我安心睡了7小时。
早上来把程序改完善一些,增加了记录等功能。
检查是否有notepad,要用的话就算成自己的进程名,如果进程宕了就过会自动重启(会在当前目录下生成一个start.bat)
set _task=notepad.exe
set _svr=c:/windows/notepad.exe
set _des=start.bat
:checkstart
for /f &tokens=5& %%n in ('qprocess.exe ^| find &%_task%& ') do (
if %%n==%_task% (goto checkag) else goto startsvr
echo %time%
echo ********程序开始启动********
echo程序重新启动于%time% ,请检查系统日志&& restart_service.txt
echo start %_svr% & %_des%
echo exit && %_des%
start %_des%
set/p=.&nul
for /L %%i in (1 1 10) do set /p a=.&nul&ping.exe /n 2 127.0.0.1&nul
echo Wscript.Sleep WScript.Arguments(0) &%tmp%/delay.vbs
cscript //b //nologo %tmp%/delay.vbs 10000
del%_des% /Q
echo ********程序启动完成********
goto checkstart
echo %time%程序运行正常,10秒后继续检查..
echo Wscript.Sleep WScript.Arguments(0) &%tmp%/delay.vbs
cscript //b //nologo %tmp%/delay.vbs 10000
goto checkstart
怎么实现一个:判断指定进程有无响应的功能函数.
已知条件为:一个进程ID,求这个进程有无响应;用VC平台实现.
我在网络查找一些资料,copy后得出以下一个程序,但不能检测出结果,运行时会出错.
接触C++不是很长时间,希望大家能帮帮我,解决这个问题,谢谢.
如果还有其它方法,请给予提示.谢谢.
///////////////////////////////////////////////////////////////////////////////
#include &windows.h&
#include &stdio.h&
typedef struct tagWNDINFO
DWORD dwProcessId;
} WNDINFO, *LPWNDINFO;
BOOL CALLBACK YourEnumProc(HWND hWnd,LPARAM lParam)
DWORD dwProcessId;
GetWindowThreadProcessId(hWnd, &dwProcessId);
LPWNDINFO pInfo = (LPWNDINFO)lP
if(dwProcessId == pInfo-&dwProcessId)
pInfo-&hWnd = hW
return FALSE;
return TRUE;
HWND GetProcessMainWnd(DWORD dwProcessId)
wi.dwProcessId = dwProcessId;
wi.hWnd = NULL;
EnumWindows(YourEnumProc,(LPARAM)&wi);
return wi.hW
//如果这个进程没有窗口,函数返回NULL
//////////////////////////////////////////////////////////////////////////
int GetProcessAnswer(DWORD iProcessid)
HWND hwnd = GetProcessMainWnd(iProcessid);
if(NULL == hwnd)return(-1);
typedef BOOL (WINAPI *PROCISHUNGAPPWINDOW)(HWND);
typedef BOOL (WINAPI *PROCISHUNGTHREAD)(DWORD);
//然后定义
PROCISHUNGAPPWINDOW
m_pIsHungAppW
PROCISHUNGTHREAD
m_pIsHungT
//定义一个bool型,来判断当前操作系统是否是Windows NT/2000以上
//因为不同的操作系统,判断程序是否运行正常的方式是不一样的
BOOL m_bIsNT;
BOOL bRetV
//获取版本信息
OSVERSIONINFO osver = {0};
osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (!GetVersionEx(&osver))
bRetVal = FALSE;
if(bRetVal == TRUE)
if (osver.dwPlatformId&VER_PLATFORM_WIN32_NT)
m_bIsNT = TRUE;
m_bIsNT = FALSE;
//获取那两个函数指针
HMODULE hUser32 = ::GetModuleHandle(&user32&);
if (!hUser32)
bRetVal = FALSE;
if(bRetVal == TRUE)
m_pIsHungAppWindow = (PROCISHUNGAPPWINDOW)
GetProcAddress( hUser32,
&IsHungAppWindow& );
m_pIsHungThread = (PROCISHUNGTHREAD) GetProcAddress( hUser32,
&IsHungThread& );
if (!m_pIsHungAppWindow && !m_pIsHungThread)
bRetVal = FALSE;
//于是判断,窗口是否是正常运行,还是未响应
//代码如下
if(m_bIsNT == TRUE)
BOOL bIsHung = m_pIsHungAppWindow(hwnd);
if(bIsHung)
return(-2);//没有响应
return(0);//正在运行
BOOL bIsHung =m_pIsHungThread(GetWindowThreadProcessId(hwnd,NULL));
if(bIsHung)
return(-2);//没有响应
return(0);//正在运行
//////////////////////////////////////////////////////////////////////////
int main()
// int iSum = int(GetProcessMainWnd(3616));//3616是进程ID
// printf(&%d&,isum);
int isum = GetProcessAnswer(3616/*这里输入进程ID*/);
printf(&%d&,isum);
return(0);
请问怎么判断一个进程是否停止响应?
fResponding
SendMessageTimeout(hwndInQuestion,
SMTO_ABORTIFHUNG,
&dwResult);
fResponding
responding
整个过程是这样:
有一个Server,Server一直运行,理想状态不会失去响应,同时有一个应用程序也在运行,当Server接到指令要检测那个应用程序是否还有响应,如果没有响应就Kill这个应用程序的进程,并重启这个应用程序。
现在关键是如何检测应用程序是否还有响应,怎么样Kill掉它,怎么样重启它这三个问题。
大家帮帮忙,这样的问题帖子很多,但都没有提供完整的例子代码,我是菜鸟,告诉我方法自己写还不太可能,需要看代码学习!谢谢了!问题点数:100、回复次数:30Top
1楼vcleaner(我没当大哥很久了.......)回复于
09:47:11得分0
应该是如何判断进程的活动状态,呵呵,写注册表,查询注册表,然后判断其值,如果和上次比较没有改变,那么就重启。这样做有滞后,但是既然能重启系统,滞后也应该能接受吧。呵呵,如果楼主能有相关的函数或者办法实时判断状态,请告诉我!
2楼laiyiling(陌生人[MVP])回复于
09:51:16得分25
用SendMessageTimeout函数向目的窗口发一个消息,如果返回0,而且GetLastError得到0,就表示该窗口线程无响应.Top
3楼vcleaner(我没当大哥很久了.......)回复于
09:52:15得分0
你可以让程序运行起来的时候写一个字符串(GetModuleFileName得到的是现在的名字和一个数字值)到注册表中的固定位置,每隔一段时间更新一下数据值,不管别人将Exe改名为什么,只要你想知道是不是你写的程序在运行,只要查询注册表就行了,如果查询的数据值多次没有改变,即说明那个程序已经当掉了,你可以重启之,呵呵,记得程序退出的时候删除注册表项。这样就可以判断是否在运行了!可以将两个程序都这么做,那么他们就能相互监控了!Top
4楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于
09:52:38得分0
最简单的方法是函数
IsHungAppWindowTop
5楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于
09:53:28得分5
IsHungAppWindow
--------------------------------------------------------------------------------
IsHungAppWindow
application
responding,
application
considered
responding
processing,
PeekMessage
IsHungAppWindow(
Parameters
responding,
LoadLibrary
GetProcAddress
accessible
accessible
appropriate
recommended
unavailable
subsequent
Information
user32.dll
Winuser.h,
User32.lib
6楼oyljerry(【勇敢的心】→㊣提拉米苏√㊣)回复于
10:04:31得分10
WaitForSingleObject等待句柄返回
Terminate终止进程
CreateProcess启动进程Top
7楼mixtrue(忽报人间曾伏虎,泪飞顿作倾盆雨。)回复于
10:09:36得分0
DentistryDoctor
IsHungAppWindow
application
(specified
application
IsHungAppWindow
PROCESS.Top
8楼ppssdd()回复于
10:18:04得分0
DentistryDoctor(雅克医生&改行做程序员了&)
IsHungAppWindow(HWND
hWnd);参数hWnd怎么取呢?你发个例子可以吗?Top
9楼ppssdd()回复于
10:19:36得分0
大家的意见都很好,就是没有例子啊!俺是菜鸟!Top
10楼ppssdd()回复于
10:23:21得分0
一个正在执行的exe文件可以叫一个应用吧,也是一个进程啊,这两个有什么区别吗?Top
11楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于
13:21:38得分0
FindWindow
EnumWindows
window.Top
12楼kingzai(stevenzhu)回复于
13:35:53得分0
http://www.vckbase.com/bbs/prime/viewprime.asp?id=334
Windows 任务管理器如何确定应用程序&没有响应&
(hangwire发表于 15:46:46)
最近参加的一个项目要求实现远程任务管理功能,也就是&Remote
Manager&(RTM)。我把它与Windows
NT的任务管理器进行了比较,发现标准的任务管理器显示应用程序的状态(正在运行或者没有响应)。标准的任务管理器发送(通过SendMessageTimeout函数)一个消息到主应用窗口,如果函数调用失败或者超时--则应用程序的状态就是&没有响应&,否则状态为&正在运行&。
但我发现还有一个更好的解决方法。本文将通过实例程序进行示范。这个方法的思路是通过调用User32.dll中一个未公开的函数来实现的。这个函数存在于Windows
9x和Windows
NT/2000系统中,但在两个系统中的名字是不同的。Windows
9x系统中的名字为:IsHungThread,在Windows
NT/2000系统中的名字为IsHungAppWindow。下面是它们的原型:
IsHungAppWindow
// 主应用窗口句柄
IsHungThread
dwThreadId,
// 主应用窗口的线程ID
不幸的是,微软在User32.lib中没有提供这两个函数的输出。也就是说,这两个函数是未公开函数,如果要在程序中使用它们,则必须通过GetProcAddress和GetModuleHandle函数动态加载:
*PROCISHUNGAPPWINDOW)
*PROCISHUNGTHREAD)
PROCISHUNGAPPWINDOW
IsHungAppWindow;
PROCISHUNGTHREAD
IsHungThread;
GetModuleHandle(&user32&);
IsHungAppWindow
(PROCISHUNGAPPWINDOW)
GetProcAddress(hUser32,&IsHungAppWindow&);
IsHungThread
(PROCISHUNGTHREAD)
GetProcAddress(hUser32,&IsHungThread&);Top
13楼kingzai(stevenzhu)回复于
13:37:18得分10
GetWindowThreadProcessId得到进程id,再OpenProcess得到进程句柄,调用TerminateProcess
CreateProcess
14楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于
13:37:43得分20
g_hWndToProcess=NULL;
EnumWindowsProc(HWND
nProcessID
dwProcessID=0;
GetWindowThreadProcessId(hwnd,&dwProcessID);
if(dwProcessID==nProcessID)
szTitle[256];
szBuf[256];
ZeroMemory(szTitle,256);
GetClassName(hwnd,
GetWindowText(hwnd,szTitle,256);
if(lstrlen(szTitle)
IsWindowVisible(hwnd)
lstrcmp(&Program&,szBuf))
OutputDebugString(szTitle);
g_hWndToProcess=
g_hWndToProcess=NULL;
EnumWindows(EnumWindowsProc,nID);//nID:目的进程的ID,必须有主窗口
if(NULL!=g_hWndProcess
IsHungAppWindow(g_hWndToProcess))
15楼gooyan(超级替补)回复于
19:30:55得分0
createmutex
16楼mixtrue(忽报人间曾伏虎,泪飞顿作倾盆雨。)回复于
10:36:00得分0
应用程序和进程当然有差别了,详情参见os 书籍。
17楼Magnus(小楼一夜听春雨)回复于
10:38:45得分0
典型的WatchDog,
讓被監視的進程定時發消息給WatchDog,
超時就認定為失去響應,
就resetTop
18楼linxy2002(BugSlayer)回复于
15:39:55得分30
呵呵,是啊,对于菜鸟来说,例子才是正道!
你把要求说清楚写,我帮你写一个,我的: linxy_.cnTop
19楼blastzgd(悟道)回复于
17:21:04得分0
楼主这个不知算不算无理要求。
你的没响应是什么意思?阻塞了?还是死循环了?
20楼linxy2002(BugSlayer)回复于
20:19:56得分0
我写了个小例子不知道符不符合你的需要,你来向我要吧Top
21楼NNBWOLF(叫花子)回复于
22:00:07得分0
阿狼也贴点代码看看...Top
22楼ppssdd()回复于
14:23:32得分0
blastzgd(边城浪子)
当window任务管理器中应用程序的状态被判为无响应时,你知道是阻塞了?还是死循环了?也是无理要求?
23楼ppssdd()回复于
14:29:35得分0
linxy2002(阿郎)
还是你理解我啊!
我给你发了消息了,多谢,你可以发给我了!~
24楼linxy2002(BugSlayer)回复于
13:15:31得分0
已经发给你了,不知道是否满足你的要求Top
25楼hjunxu(hjun)回复于
14:39:05得分0
楼主你的应用好奇怪啊。
如果程序在很忙的干活,比如处理一个消息响应很久,messagepump没有动静系统就会认为你的程序没有响应的,所以可能杀错。Top
26楼hjunxu(hjun)回复于
14:41:29得分0
你可以说说你这样应用理由吗?Top
27楼zhouhuaikun(怀空)回复于
14:48:06得分0
28楼ppssdd()回复于
13:53:39得分0
hjunxu(hjun):
“如果程序在很忙的干活,比如处理一个消息响应很久,messagepump没有动静系统就会认为你的程序没有响应的,所以可能杀错。”
你说得很有道理,但我要实现的目的与这个没什么大的关系,因为有个重要应用是不能长时间失去响应,也就是说宁可错杀,不可漏杀,反正要重启的!
29楼ppssdd()回复于
13:55:17得分0
linxy2002(阿郎)
已经收到,谢谢!我已经看了,帮助很大!
30楼lnp()回复于
18:36:44得分0
软件名称:AlwaysUp
软件版本:v6.5.9.28
软件大小:3.77 MB
适用平台:Windows ALL
软件主页:http://www.coretechnologies.com/products/AlwaysUp/
软件简介:
能将可执行文件、批处理文件及快捷方式作为windows系统服务,并且进行管理和监视确保100%运行。当程序崩溃、挂起、弹出错误对话框时,AlwaysUp能自动重启程序,并运行自定义的检查功能确保程序一直可用。AlwaysUp能发送详细的email使你清楚地了解崩溃、重启等事件。
下载地址:http://www.coretechnologies.com/products/alwaysup/AlwaysUp_Installer.exe
以上就是Wingdows下各种类型的守护进程的写法的全文介绍,希望对您学习和使用程序编程有所帮助.
这些内容可能对你也有帮助
更多可查看其它编程列表页。
猜您也会喜欢这些文章

我要回帖

更多关于 linux nohup 守护进程 的文章

 

随机推荐