前面提到过的服务器都占有控制终端。而有些进程并不需要控制终端。比如我们想写一个回射服务器(既从终端得到信息,然后将数据再返回给终端,基于UDP因为比较简单)。
其实这并算不上一个难题,在shell中只要在指令后加上&就可以使服务器成为一个守护进程(后台进程)。但这里还是通过代码自己来实现。
#include "stdio.h"
#include "stdlib.h"
#include "/programe/net/head.h"
#include "syslog.h"
#include "sys/types.h"
#include "signal.h"
#include "string.h"
#define MAXSIZE 100
int main(int argc, char ** argv) {
openlog("echo_server2", LOG_CONS | LOG_PID, 0);
syslog(LOG_INFO | LOG_LOCAL0, "server start....");//利用syslog来写日志
if(fork() != 0)
exit(0);//父进程退出
//父进程退出后,shell就认为命令结束使得子进程在后台开始运行
setsid();
//子进程建立新的对话期,子进程继承了父进程的组进程号,该进程组的组长为父进程,所以子进程可以自己建立一个对话期,建立对话期的子进程不再有控制终端(详细可以看linux进程组,对话期)
signal(SIGHUP, SIG_IGN);
//忽略SIGHUP信号,这个作用下个解释会提到
if(fork() != 0)
exit(0);
//子进程再建立一个子进程,我们称第一个子进程为P1,有P1创建的子进程为P2。P1新建了一个对话期,P1就会作为这个对话期首进程,在SVR4中,作为对话期首进程的P1如果打开一个终端设备(如果这个设备不是其它对话期的终端),则该终端设备就会自动成为这个会话期的终端。创建P2,P2不是对话期的首进程即使打开终端设备也不会把该设备变成这个对话期的终端。(打开终端设备可以通过open(/dev/....))。前面之所以要忽略掉SIGHUP信号,是因为所谓对话期的首进程P1退出时候,会向对话期前台进程组的每一个进程发送SIGHUP信号,该信号默认操作是终止进程。
int i;
for(i = 0; i < 64; i++) {
close(i);
}
//关闭从父进程继承而来的描述字,这里我们并不知道一共有多少个描述字被打开(其实因该猜到只有3个),所以以64为标准,如果不想一个的标准输入输出函数出错(例如printf之类),可以将0,1,2描述字指向/dev/null。当然既然是后台守护进程,其实这也没多大必要
//后面的代码就见过很多次了
int sockfd;
struct sockaddr_in serv_socket;
char buf[MAXSIZE + 1];
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&serv_socket, sizeof(serv_socket));
serv_socket.sin_family = AF_INET;
serv_socket.sin_addr.s_addr = htonl(INADDR_ANY);
serv_socket.sin_port = htons(9843);
int flag = bind(sockfd, (struct sockaddr *)&serv_socket, sizeof(serv_socket));
if(flag == -1) {
syslog(LOG_DEBUG | LOG_LOCAL0, "bind error\n");
exit(1);
}
for(;;) {
struct sockaddr_in client_socket;
socklen_t len = sizeof(client_socket);
int n = recvfrom(sockfd, buf, MAXSIZE, 0, (struct sockaddr *)&client_socket, &len);
char client_ip[16];
inet_ntop(AF_INET, &client_socket.sin_addr, client_ip, sizeof(client_ip));
syslog(LOG_DEBUG | LOG_LOCAL0, "get message from %s\n", client_ip);
int flag = sendto(sockfd, buf, n, 0, (struct sockaddr *)&client_socket, sizeof(client_socket));
if(flag == -1)
syslog(LOG_DEBUG | LOG_LOCAL0, "send message to %s false\n", client_ip);
}
}
分享到:
相关推荐
例如,一个简单的HTTP服务器守护进程可能会监听80端口,接收HTTP请求,然后返回相应的网页内容。守护进程的设计应考虑并发处理能力、错误处理以及资源管理,以确保服务的健壮性和可靠性。 在实际开发中,我们还会...
通过redis,获取列表 操作html页面移动
在计算机编程领域,特别是Windows操作系统环境下,守护进程(也称为后台服务)是一种长期运行、通常独立于用户交互之外的程序。它主要用于执行系统管理任务或提供某种持续性的功能支持。在VC++环境下创建守护进程,...
守护进程的主要任务是提供系统服务,如网络服务(如HTTP服务器httpd)、作业调度(如cron)、打印服务(如lpd)等。它们可以周期性地执行任务或等待处理特定事件,是系统稳定运行的基石。 守护进程具有以下特征: 1...
因工作需要,用VB编写的一个进程守护程序,自动检测守护进程的运行状态(运行,未激活,无响应),再根据你的设置来重启未激活及无响应的进程。可根据需要来设置定时启动进程和系统的时间。定时启动进程时,自动结束...
守护进程在计算机系统中扮演着重要的角色,它们通常在后台运行,不与用户直接交互,负责执行特定的任务,如服务管理、日志记录、定时任务等。在本话题中,我们将深入探讨守护进程的原理、C/C++实现以及如何设计具有...
《编写Linux守护进程》这篇文献主要探讨了如何在Linux操作系统中创建和管理守护进程,这是一种在后台运行且独立于控制终端的进程,常用于提供系统服务,如HTTP服务器、打印服务等。守护进程的主要特点包括: 1. **...
"Windows守护进程小工具"是一种实用程序,设计用于确保特定应用程序始终在Windows操作系统上运行。这个工具的核心功能是监控指定的程序,如果发现该程序未运行,它将自动启动该程序。这为用户提供了保障,确保关键...
在分布式系统、服务器维护以及后台任务执行等领域,守护进程的应用尤为常见。 在C#中实现进程守护,可以通过以下几种方式: 1. **使用System.Diagnostics命名空间**:C#的System.Diagnostics命名空间提供了Process...
守护进程在Unix-like系统中非常常见,例如网络服务(如HTTP服务器Apache或Nginx)、数据库服务(如MySQL或PostgreSQL)以及计划任务(如Cron)等都是通过守护进程来实现的。 标题和描述中提到的"2个相互守护防杀的...
在实际应用中,这样的守护进程可能用于保持关键服务的连续运行,例如数据库服务器、Web服务器或其他后台应用程序。通过C#,我们可以轻松地将这些功能集成到Windows环境中,确保系统的稳定性和可靠性。
在C#编程环境中,开发一个控制台应用作为守护进程(Daemon)是常见的需求,尤其在服务器端软件中,为了确保核心服务的持续运行,我们往往需要一个后台程序来监控并管理这些服务。在这个名为"C#控制台实现的一个简单...
标题中的“tomcat守护进程.rar”指的是一个关于如何在Windows操作系统下配置Tomcat服务器作为守护进程的教程或代码集合。守护进程(Daemon)通常是指在后台运行而不与用户交互的进程,这种设置允许Tomcat在没有图形...
守护进程运行的信息服务器,服务端接收客户端的连接请求,记录客户端的IP地址和端口,并将这些信息回传给客户端。客户端则向指定IP地址和端口发送连接请求,并接收服务器返回的信息。 这种实现方式展示了如何在...
使用VS2015开发的MFC服务器守护进程工具,网络传输部分使用CSocket+ProtoBuf的组合。该程序可以单独使用,也可以作为服务器端使用,配合下一个上传的 运维工具(守护进程客户端)。
Linux 的大多数服务器进程就是用守护进程实现的,例如 Internet 服务器 inetd、Web 服务器 httpd 等。同时,守护进程完成许多系统任务,比如作业规划进程 crond、打印进程 lpd 等。 守护进程的特点是独立于终端,...
Linux系统中许多重要的服务都是通过守护进程实现的,例如Internet服务器`inetd`、Web服务器`httpd`、作业规划进程`crond`以及打印进程`lpd`等。 守护进程具有以下关键特性: 1. **后台运行**:守护进程不依赖于...
因为控制台程序出现过因为连接第三方服务超时直接挂掉(此时负载少了一个节点)以及服务器出现意外重启问题(该服务器所有节点宕机),所以需要一个进程守护程序。 也找过 现场的脚本、python的程序、pm2守护方式,...
守护进程常用于提供持续的服务,例如Web服务器、数据库服务等。本篇文章将深入探讨如何用Python编写一个守护进程,以及在进程被杀后自动重启的实现方法。 首先,让我们了解守护进程的基本概念。在Unix-like操作系统...
对于 Tomcat 这样的应用服务器而言,守护进程可以在服务器异常关闭或遇到故障时自动启动,从而保证服务的连续性和稳定性。 心跳检测是一种常用的健康检查机制,通过定期发送请求到指定的服务端口来判断服务是否正常...