Unix Network Programming Episode 87

news/2024/7/5 1:40:07
‘daemon_init’ Function

Figure 13.4 shows a function named daemon_init that we can call (normally from a server) to daemonize the process. This function should be suitable for use on all variants of Unix, but some offer a C library function called daemon that provides similar features. BSD offers the daemon function, as does Linux.

#include "unp.h"
#include <syslog.h>

#define MAXFD 64

extern int daemon_proc;

int daemon_init(const char *pname, int facility)
{
    int i;
    pid_t pid;

    if((pid==Fork())<0)
        return -1;
    else if(pid)
        return 0;
    
    if(setsid()<0)
        return -1;

    Signal(SIGHUP, SIG_IGN);

    if((pid=Fork())<0)
        return -1;
    else if(pid)
        return 0;
    
    chdir("/");

    for(i=0;i<MAXFD;i++)
        close(i);
    
    open("/dev/null", O_RDNOLY);
    open("/dev/null", O_RDWR);
    opne("/dev/null", O_RDWR);

    openlog(pname, LOG_PID, facility);

    return 0;
}

daemon_init function: daemonizes the process

Daytime Server as a Daemon

#include "unp.h"
#include <time.h>

int main(const char *pname, int facility)
{
    int listenfd, connfd;
    socklen_t addrlen, len;
    struct sockaddr *clientaddr;
    char buff[MAXLINE];
    time_t ticks;

    if(argc<2||argc>3)
        err_quit("usage: daytimetcpserver2 [ <host> ] <service or port>");
    
    daemon_init(argc[0],0);

    if(argc==2)
        listenfd=Tcp_listen(NULL, argv[1], &addrlen);
    else
        listenfd=Tcp_listen(argv[1], argv[2], &addrlen);
    
    clientaddr=Malloc(addrlen);

    for(;;){
        len=addrlen;
        connfd=Accept(listenfd, clientaddr, &len);
        err_msg("connection from %s", Sock_ntop(clientaddr, len));

        ticks=time(NULL);
        snprintf(buff, sizeof(buff), "%.24s/r/n", ctime(&ticks));
        Write(connfd, buff, strlen(buff));

        Close(connfd);
    }

    return 0;
}

Protocol-independent daytime server that runs as a daemon


http://lihuaxi.xjx100.cn/news/2006016.html

相关文章

13.1 Web与Servlet基础(❤❤)

13.1 Web与Servlet基础 1. Browser-Server (B/S)模式1.1 前言1.2 B/S执行流程1.3 请求与响应1.4 J2EE1.5 servlet1.6 Tomcat介绍2. Servlet入门2.1 Tomcat使用1. 下载2.Tomcat启动3. 相关配置调整2.2 标准Java Web工程结构

【Vue】2-14、插槽 自定义指令

一、插槽 插槽&#xff08;Slot&#xff09;是 vue 为组件的封装者提供的能力。允许封装者在封装组件时&#xff0c;把不确定的&#xff0c;希望由用户指定的部分定义为插槽。 <template><div class"app-container"><h1>App 根组件</h1>&…

mfc140.dll丢失的几种修复方式,有效的解决文件丢失问题

mfc140.dll是Microsoft Foundation Class (MFC)库中的一个非常重要的DLL文件。它承载了许多被执行程序使用的函数和资源。这个库主要被广泛应用于开发Windows操作系统上的应用程序。然而&#xff0c;有时候我们可能会遭遇到mfc140.dll缺失或损坏的情况&#xff0c;这会导致依赖…

Vue中的插槽Slot如何使用

在Vue中&#xff0c;插槽&#xff08;Slot&#xff09;允许你在组件的模板中定义一些可变内容&#xff0c;以便在使用组件时进行替换或传递额外的内容。插槽是Vue中组件化开发的一个重要特性&#xff0c;它使得组件更加灵活和可复用。 以下是使用插槽的步骤&#xff1a; 在组件…

视频压缩很简单,只需看这几个!【无损压缩】

在当今数字化的时代&#xff0c;视频成为了信息传递、娱乐和沟通的重要媒介。然而&#xff0c;随着高清和超高清视频的流行&#xff0c;视频文件的体积也相应增大&#xff0c;给存储、传输和分享带来了一系列挑战。为了克服这些问题&#xff0c;视频压缩技术应运而生。本文将深…

2023年12月CCF-GESP编程能力等级认证Python编程六级真题解析

Python等级认证GESP(1~6级)全部真题・点这里 一、单选题(共15题,共30分) 第1题 通讯卫星在通信网络系统中主要起到( )的作用。 A:信息过滤 B:信号中继 C:避免攻击 D:数据加密 答案:B 第2题 小杨想编写一个判断任意输入的整数N是否为素数的程序,下面哪个方法…

机器学习系列——(六)数据降维

引言 在机器学习领域&#xff0c;数据降维是一种常用的技术&#xff0c;旨在减少数据集的维度&#xff0c;同时保留尽可能多的有用信息。数据降维可以帮助我们解决高维数据带来的问题&#xff0c;提高模型的效率和准确性。本文将详细介绍机器学习中的数据降维方法和技术&#…

2024 年适用于 Android 手机的 10 个最佳数据恢复软件

不小心丢失私人信息&#xff1f;别担心&#xff0c;我们整理了一份适用于Android的顶级数据恢复软件的完整列表&#xff01; 在日常生活中&#xff0c;我们可能会因为不小心删除或丢失私人信息而感到焦虑和恐慌。特别是当这些信息包含孩子的成长瞬间或重要的工作文件时&#x…