c语言监控程序,C语言写监控守护进程
C语言写监控守护进程
1.[代码][C/C++]代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define TCP_PORT 8888
int daemon(int,int);
int fork2(void);
void closeall(int);
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;
}
/* 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语言监控程序,C语言写监控守护进程相关推荐
- 大神教你如何给脚本写一个守护进程
在我们日常运维中,写脚本监控一个进程是比较常见的操作,比如我要监控mysql进程是否消失,如果消失就重启mysql. 用下面这段代码就可以实现: #!/bin/shDate=` date '+%c'` ...
- 一个短小精悍的监控/守护进程
一个短小精悍的监控/守护进程 Author: 柳大·Poechant(钟超) Email: zhongchao.ustc#gmail.com Blog: Blog.CSDN.net/Poechant ...
- linux怎么监控守护进程,linux shell脚本守护进程监控svn服务
最近搭建的svn服务不知道什么原因服务总是被关闭(如果你不知道怎么搭建svn可以参考linux下搭建svn版本控制软件),因此用shell脚本实现一个守护进程.用于监控svn服务是否启动,如果服务不在 ...
- Linux守护进程service Daemon 【C语言构建简单的守护进程】
Linux Daemon Writing HOWTO 这里视频讲的很清楚 牛客网-c/C++Linux课程-守护进程 int main() {// 1.创建子进程,退出父进程pid_t pid = f ...
- Linux学习之系统编程篇:编写一个守护进程
需求:写一个守护进程,每隔 2s 获取一次系统时间,将这个时间写入到磁盘文件 #include <stdio.h> #include <stdlib.h> #include & ...
- python 守护程序检测进程是否存在_python创建守护进程的疑问
我自己写了一个简易的下载和文件执行的客户端,如下 """ 省略若干代码 """ #执行下载函数 def do_script(): " ...
- 【Linux系统编程】守护进程、线程
------------->[Linux系统编程/网络编程](学习目录汇总) <-------------- 目录 1.守护进程 1.1 进程组 1.2 会话 1.3 setsid()函数 ...
- 宝塔面板使用Supervisor管理器开启守护进程
1.宝塔面板的安装 宝塔官网链接 windows采用下一步安装方式 liunx安装命令 centos yum install -y wget && wget -O install.sh ...
- Qt 守护进程,保活
一,背景 一台windows电脑,只允许一个我方开发的软件,并且设置了自定义桌面的方式,也就是说没有桌面,软件一旦崩溃或者无响应,那么用户只能是重启电脑,体验很差,所以单独写一个守护进程,当主进程出现 ...
最新文章
- php gridview,GridView - [ Android中文手册 ] - 在线原生手册 - php中文网
- eclipse下tomcat添加部署Module,Web名称与项目名称不一致的解决方法
- 初级数据分析师需要哪些必备技能?
- .NET CORE 2.1 导出excel文件的两种方法
- 1062. Talent and Virtue (25)
- leetcode468. 验证IP地址
- C++(STL):29 ---关联式容器map 迭代器
- linux目录形式,linux 系统下 ngnix 显示目录形式
- iOS 跨平台开发,该用 Flutter 还是 Swift?
- 乘“峰”而上,聚生态之力共创软件产业新未来
- crio电压采集 labview_LabVIEW与cRIO入门.pdf
- 微信公众平台卡劵功能接入指南
- 使用皮卡(pika)操作RabbitMQ
- 【官方文档】Fluent Bit 1.8 官方文档
- hdu 2121 最小树形图 +虚根
- 直播平台录播系统架构
- MY-I.MX6-DEMO Android4.4.2环境搭建
- Web端CAD图形找不同?一键在Web端找出CAD图不同并对比分析
- 80后程序员感慨中年危机,应聘java工程师自我介绍
- Doris的安装部署
热门文章
- if连续判断php_if判断语句_php if elseif 条件判断语句使用方法
- 黑马程序员—专题三:黑马学院周边环境——睁大你的眼睛看清楚哦
- img src php 微信 苹果,javascript - file上传的图片,生成到canvas,toDataUrl后在苹果微信上保存下来,是黑色的。...
- 【kafka系列教程15】kafka持久化
- html行间距1.8em,css如何控制行间距?
- C语言/C++内存管理
- 小程序登录状态/手机号码获取
- 14类应用场景!《5G未来社区白皮书》发布 | 附下载
- 多用户通讯系统(网络编程,多线程,IO流,面向对象)
- CCF CSP认证成绩代替考研复试机试!