UNP函数笔记十: 守护进程和inetd超级服务器
来源:互联网 发布:淘宝瘦身贴真的有效吗 编辑:程序博客网 时间:2024/05/23 17:40
第十三章 守护进程和inetd超级服务器:
#include <syslog.h>void syslog(int priority, const char * format, ...);#include <syslog.h>void openlog(const char * ident, int option, int facility);void closelog(void); option: LOG_CONS, LOG_NDELAY, LOG_NOWAIT, LOG_ODELAY, LOG_PERROR, LOG_PID facility: LOG_AUTH, LOG_AUTHPRIV, LOG_CRON, LOG_DAEMON, LOG_FTP, LOG_KERN, LOG_LOCAL0, LOG_LOCAL1, LOG_LOCAL2, LOG_LOCAL3, LOG_LOCAL4, LOG_LOCAL5, LOG_LOCAL6, LOG_LOCAL7, LOG_LPR, LOG_MAIL, LOG_NEWS, LOG_SYSLOG, LOG_USER, LOG_UUCP level: LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO, LOG_DEBUG priority: facility | level %m: ("%s", strerror(errno))
示例:
#include <fcntl.h>#include <unistd.h>#include <syslog.h>#include "my_signal.h"#define MAXFD 64int daemon_init(const char * pname, int facility){ int i; pid_t pid; if ((pid = fork()) < 0) { return(-1); } else if (pid > 0) { _exit(0); /* parent terminates */ } /* child 1 continues... */ if (setsid() == -1) { /* become session leader */ return(-1); } my_signal(SIGHUP, SIG_IGN); if ((pid = fork()) < 0) { return(-1); } else if (pid > 0) { _exit(0); /* child 1 terminates */ } /* child 2 continues... */ chdir("/"); /* change working directory */ /* close off file descriptors */ for (i = 0; i < MAXFD; i++) { close(i); } /* redirect stdin, stdout, and stderr to /dev/null */ open("/dev/null", O_RDONLY); open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); openlog(pname, LOG_PID, facility); return (0); /* success */}
#include <syslog.h>void daemon_inetd(const char * pname, int facility){ openlog(pname, LOG_PID, facility);}
#include <time.h>#include <errno.h>#include <stdlib.h>#include <string.h>#include "sock_ntop.h"#include "tcp_listen.h"#include "daemon_init.h"#define MAXLINE 4096intmain(int argc, char ** argv){ ssize_t n; int listenfd; int connfd; socklen_t addrlen; socklen_t len; struct sockaddr * cliaddr; char * ptr; char buff[MAXLINE]; time_t ticks; if (argc < 2 || argc > 3) { printf("usage: daytimetcpsrv2 [ <host> ] <service or port>\n"); exit(1); } daemon_init(argv[0], 0); /* need change "printf" to "syslog" in tcp_listen */ if (argc == 2) { listenfd = tcp_listen(NULL, argv[1], &addrlen); } else { listenfd = tcp_listen(argv[1], argv[2], &addrlen); } if ((cliaddr = (struct sockaddr *)malloc(addrlen)) == NULL) { syslog(LOG_ERR, "malloc failed: %s", strerror(errno)); exit(1); } for ( ; ; ) { len = addrlen; if ((connfd = accept(listenfd, cliaddr, &len)) == -1) { syslog(LOG_ERR, "accept error: %s", strerror(errno)); exit(1); } if ((ptr = sock_ntop(cliaddr, len)) == NULL) { syslog(LOG_ERR, "sock_notp error: %s", strerror(errno)); exit(1); } syslog(LOG_INFO, "connection from %s", ptr); ticks = time(NULL); snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks)); n = strlen(buff); if (write(connfd, buff, n) != n) { syslog(LOG_ERR, "write error: %s", strerror(errno)); exit(1); } if (close(connfd) == -1) { syslog(LOG_ERR, "close error: %s", strerror(errno)); exit(1); } }}
#include <time.h>#include <errno.h>#include <stdlib.h>#include <string.h>#include "sock_ntop.h"#include "daemon_inetd.h"#define MAXLINE 4096int main(int argc, char ** argv){ ssize_t n; socklen_t len; struct sockaddr * cliaddr; char * ptr; char buff[MAXLINE]; time_t ticks; daemon_inetd(argv[0], 0); cliaddr = (struct sockaddr *)malloc(sizeof(struct sockaddr_storage)); if (cliaddr == NULL) { syslog(LOG_ERR, "malloc failed: %s", strerror(errno)); exit(1); } len = sizeof(struct sockaddr_storage); if (getpeername(0, cliaddr, &len) == -1) { syslog(LOG_ERR, "getpeername error: %s", strerror(errno)); exit(1); } if ((ptr = sock_ntop(cliaddr, len)) == NULL) { syslog(LOG_ERR, "sock_notp error: %s", strerror(errno)); exit(1); } syslog(LOG_INFO, "connection from %s", ptr); ticks = time(NULL); snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks)); n = strlen(buff); if (write(0, buff, n) != n) { syslog(LOG_ERR, "write error: %s", strerror(errno)); exit(1); } if (close(0) == -1) { /* close TCP connection */ syslog(LOG_ERR, "close error: %s", strerror(errno)); exit(1); } free(cliaddr); exit(0);}
- UNP函数笔记十: 守护进程和inetd超级服务器
- UNP学习笔记(第十三章 守护进程和inetd超级服务器)
- UNP卷1:第十三章(守护进程和inetd超级服务器)
- 守护进程和inetd超级服务器
- 守护进程和inetd超级服务器
- 守护进程和inetd超级服务器
- 第12章 守护进程和inetd超级服务器
- 第13章 守护进程和inetd超级服务器
- Linux/UNIX网络编程笔记(五) -守护进程和inetd超级服务器
- UNIX网络编程笔记(9)—守护进程和inetd超级服务器
- linux守护进程与inetd超级服务器
- Unix网络编程代码 第13章 守护进程和inetd超级服务器
- UNIX网络编程---守护进程和inetd超级服务器(十三)
- 《unix网络编程》(21)守护进程和inetd超级服务器
- UNIX网络编程卷一:第十三章 守护进程和inetd超级服务器
- UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数
- 《Unix网络编程》卷1:套接字联网API(第3版):守护进程和inetd超级服务器、高级I/O、Unix域协议
- inetd 守护进程
- android屏幕信息获取的两种方法
- 基于光标读取xml stax入门
- 重启自己的程序
- [Android] Android中将一个图片切割成多个图片
- linux查看系统启动时间
- UNP函数笔记十: 守护进程和inetd超级服务器
- TCP慢启动过程
- 关于在亚马逊云计算上搭建网站的可行性分析
- iOS 手势简单使用总结
- object-c内存管理详解
- vbs监视注册表变化
- android Matrix.setRotate 和 postRotate的区别
- MYSQL不能从远程连接的一个解决方法
- VS2008 运行VC\Bin下的link.exe, cl.exe, lib.exe提示找不到mspdb80.dll的解决方法