`

[转]C语言写监控守护进程

 
阅读更多

来源:http://bbs.chinaunix.net/archiver/?tid-393658.html

UNIX Programming FAQ 中文版 v0.1.0(转)

一个使用以上函数的范例程序:

#include <sys/types.h>;
#include <sys/socket.h>;
#include <netinet/in.h>;
#include <stdio.h>;
#include <stdlib.h>;
#include <syslog.h>;
#include <errno.h>;

int daemon(int,int);
int fork2(void);
void closeall(int);

#define TCP_PORT 8888

void errexit(const char *str)
{
syslog(LOG_INFO, "%s failed: %d (%m)", str, errno);
exit(1);
}

void errreport(const char *str)
{
syslog(LOG_INFO, "%s failed: %d (%m)", str, errno);
}

/* 实际的子进程在此. */

void run_child(int sock)
{
FILE *in = fdopen(sock,"r");
FILE *out = fdopen(sock,"w");
int ch;

setvbuf(in, NULL, _IOFBF, 1024);
setvbuf(out, NULL, _IOLBF, 1024);

while ((ch = fgetc(in)) != EOF)
fputc(toupper(ch), out);

fclose(out);
}

/* 这是守护程序的主要工作 -- 侦听连接并生成子进程 */

void process()
{
struct sockaddr_in addr;
int addrlen = sizeof(addr);
int sock = socket(AF_INET, SOCK_STREAM, 0);
int flag = 1;
int rc = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
&flag, sizeof(flag));

if (rc < 0)
errexit("setsockopt");

addr.sin_family = AF_INET;
addr.sin_port = htons(TCP_PORT);
addr.sin_addr.s_addr = INADDR_ANY;

rc = bind(sock, (struct sockaddr *) &addr, addrlen);
if (rc < 0)
errexit("bind");

rc = listen(sock, 5);
if (rc < 0)
errexit("listen");

for (;;)
{
rc = accept(sock, (struct sockaddr *) &addr, &addrlen);

if (rc >;= 0)
switch (fork2())
{
case 0:close(sock); run_child(rc); _exit(0);
case -1: errreport("fork2"); close(rc); break;
default: close(rc);
}
}
}

int main()
{
if (daemon(0,0) < 0)
{
perror("daemon");
exit(2);
}

openlog("test", LOG_PID, LOG_DAEMON);

process();

return 0;
}

#include <unistd.h>;
#include <stdlib.h>;
#include <fcntl.h>;
#include <signal.h>;
#include <sys/types.h>;
#include <sys/wait.h>;
#include <errno.h>;

/* closeall() -- 关闭所有>;=给定值的文件描述符 */

void closeall(int fd)
{
int fdlimit = sysconf(_SC_OPEN_MAX);

while (fd < fdlimit)
close(fd++);
}

/* daemon() - 将进程从用户端脱离并消失进入后台,若失败返回-1,
* 但是在那种情况下你只能退出,因为我们可能已经生成了子进程。
* 这是基于BSD的版本,所以调用方需负责类似umask等等其它的工作。
*/

/* 相信在所有Posix系统上都能工作 */

int daemon(int nochdir, int noclose)
{
switch (fork())
{
case 0:break;
case -1: return -1;
default: _exit(0); /* 原进程退出 */
}

if (setsid() < 0) /* 不应该失败 */
return -1;

/* 如果你希望将来获得一个控制tty,则排除(dyke)以下的switch语句 */
/* -- 正常情况不建议用于守护程序 */

switch (fork())
{
case 0:break;
case -1: return -1;
default: _exit(0);
}

if (!nochdir)
chdir("/");

if (!noclose)
{
closeall(0);
open("/dev/null",O_RDWR);
dup(0); dup(0);
}

return 0;
}

/* fork2() -- 类似fork函数,但子进程立刻变成孤儿进程
* (当它退出时不产生僵死进程)
* 返回1给父进程,不是任何有意义的进程号.
* 父进程不能使用wait函数等待子进程结束 (它们是无关的).
*/

/* 这个版本假设你没有捕获和忽略SIGCHLD信号. */
/* 如果你有设定,则不管怎样应使用fork函数 */

int fork2()
{
pid_t pid;
int rc;
int status;

if (!(pid = fork()))
{
switch (fork())
{
case 0:return 0;
case -1: _exit(errno); /* 假设错误码都小于256 */
default: _exit(0);
}
}

if (pid < 0 || waitpid(pid,&status,0) < 0)
return -1;

if (WIFEXITED(status))
if (WEXITSTATUS(status) == 0)
return 1;
else
errno = WEXITSTATUS(status);
else
errno = EINTR;/* 唉,类似这个 :-) */

return -1;
}

分享到:
评论

相关推荐

    C语言编写linux下的守护进程

    * 系统服务:守护进程可以提供系统服务,例如系统日志服务、系统监控服务等。 编写 Linux下的守护进程需要使用 C 语言,了解操作系统的基本概念和函数调用。通过使用 fork 函数、setsid 函数、close 函数、chdir ...

    进程监控和守护 linux C

    进程监控 进程守护 linux C语言 j进程重启 进程管理 利用linux C语言编写,读取配置文件里面要求启动的程序,并进行实时监控,若进程异常退出,就重新启动 主要功能: 1.读取配置文件程序 2.启动进程 3.监控进程,...

    Java实现Linux下服务器程序的双守护进程

    使用双守护来提高稳定性,守护A负责监控服务器程序与守护B,守护B负责监控守护A,任何一方出现问题,都能快速的启动程序,提高服务器程序的稳定性。  Java的运行环境不同于C等语言开发的程序,Java程序跑在JVM上面...

    16——Linux的进程守护

    3. 使用工具库:例如在C语言中,可以使用`daemontools`、`sysvinit`、`systemd`等工具库来帮助管理守护进程。 **五、守护进程的监控与管理** 1. `logrotate`:用于定期轮换日志文件,保持日志文件大小在合理范围内...

    Java实现Linux下双守护进程

    Java环境下,由于Java程序运行在JVM上,不能像C语言那样直接创建进程,因此实现守护进程需要特定的策略。 ### 一、简介 Java中的双守护进程方案旨在解决服务器程序异常退出后无人值守的问题。通常,一个守护进程会...

    linux waitpid检测子进程是否退出

    这种模式常用于实现进程循环,比如守护进程需要持续地创建和重启执行特定任务的子进程。 子进程的退出状态通常通过`exit()`函数设定,或者是由于异常终止(如信号导致)。退出状态码是一个整数,0表示正常退出,非...

    arm linux 嵌入式 查proc的软看护程序 daemon.rar

    2. **守护进程编程**:使用C语言或其他编程语言编写守护进程,使其在后台运行并周期性地更新看门狗定时器。守护进程应当设计为即使在其他系统组件出现问题时也能持续运行。 3. **/proc文件系统**:通过读写`/proc/...

    原版win10-进程保护驱动源码_c_保护驱动_进程保护_win10驱动保护_win10进程保护

    3. 进程监控:驱动可能会包含代码来监控指定进程的行为,例如启动、关闭、内存读写等,以便及时发现异常。 4. 权限控制:驱动可能使用内核API来改变进程权限,阻止未经授权的访问。 5. 安全策略:项目可能包含一套...

    PHP守护进程化在C和PHP环境下的实现

    2. **使用`supervisor`工具**:`supervisor`是一个强大的进程管理工具,可以方便地管理和监控守护进程。推荐在生产环境中使用`supervisor`来启动和管理PHP守护进程,具体的配置和使用教程可以在官方文档或网络上找到...

    Linux集群环境下监控Web服务器的Shell脚本设计.pdf

    文章首先介绍了守护进程和Shell的基本概念及其特性,然后针对Linux集群下如何有效管理多台服务器,以监控Web服务器为例,设计了一种Shell脚本守护程序,并对其进行了验证测试。结果表明,该Shell脚本监控Web服务器是...

    unix平台下的c语言高级编程指南

    在Unix下,还有一种称为“守护进程”的特殊进程,它们在后台运行,不与终端关联。通过`daemon()`函数可以实现这一功能。守护进程常用于服务程序,如Web服务器和数据库服务。 除此之外,Unix还提供了一系列的系统...

    很不错的FTP服务器 源码C语言

    【标题】"很不错的FTP服务器 源码...在这个项目中,你可能需要分析和修改FTP服务器源码,了解其工作原理,也可能涉及其他高级Linux技术,如守护进程、系统调用、内核模块等。通过实际操作,可以积累宝贵的工程经验。

    后台定时提醒 C程序

    1. **创建守护进程**:在Unix/Linux系统中,通过`fork()`和`setsid()`函数可以创建一个脱离控制台的守护进程。而在Windows中,我们需要使用`CreateService()` API来创建服务。 2. **设置定时器**:选择合适的定时器...

    理解Unix进程_超清中文带目录版pdf

    7. **守护进程(Daemon)**:Unix系统中的守护进程是在后台运行、不与终端关联的特殊进程,通常用于提供持续的服务,如Web服务器、邮件服务器等。 8. **资源限制和权限**:书中还会涵盖Unix中的资源限制(如打开...

    Linux基于C实现的邮件服务器性能监控系统的设计(论文).doc

    多进程用于并发监控五个主要对象,而守护进程则使得程序能在后台无控制台情况下持续运行,不影响终端使用。同时,系统利用信号量和共享内存实现进程间通信,确保数据的正确传递和程序的正常退出。 第四章和第五章...

    基于Linux的C语言编程题在线评分平台的搭建.pdf

    - 评分模块作为Linux守护进程运行,持续监听和接收来自Web服务器的程序和测试数据。 - 学生通过Web界面提交代码,Web服务器通过Servlet接收请求,并将程序和测试数据转发至评分服务进程。 - 评分服务进程与...

    Linux系统下利用C程序输出某进程的内存占用信息

    ### Linux系统下利用C程序输出某进程的内存占用信息 #### 前言 在Linux环境中,了解进程的内存占用情况对于系统管理和性能...这种方法对于系统监控、性能分析等场景非常有用。希望本文能为您的学习或工作带来帮助!

    stackdog-源码.rar

    同时,通过对Stackdog源码的学习,开发者可以了解如何在C语言中编写高效、可靠的守护进程,以及如何利用系统调用来实现对进程的监控。 总之,Stackdog是一个优秀的开源项目,它的源码为我们揭示了如何有效地检测和...

    “C语言程序设计”理论与实践一体化教学的几点实践.pdf

    该系统软件包含客户端系统、教师系统和守护进程三个子系统,功能包括机房信息管理、任务监视、点名、提问和监控等,从而确保学生在实验期间的操作仅限于教师布置的任务。 此外,文章强调了培养学生兴趣的重要性,...

Global site tag (gtag.js) - Google Analytics