網(wǎng)絡(luò)通信四——守護(hù)進(jìn)程和回彈IP——1-14

// 創(chuàng)建一個(gè)守護(hù)進(jìn)程每間隔10秒向當(dāng)前目錄下的daemon.log文件寫入一條"hello shangqian!!"

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int _running = 1;

int main(int argc, char *argv[])
{
    pid_t pid = 0;
    int i = 0;
    int max_fd = 0;

    // 1.fork子進(jìn)程,父進(jìn)程退出
    if((pid = fork()) > 0)
    {
        exit(0);
    }
    
    // 2.創(chuàng)建新會(huì)話,使得子進(jìn)程脫離了原來(lái)的控制終端,會(huì)話期,進(jìn)程組
    setsid();
    
    // 3.改變工作目錄為不可卸載之目錄
    chdir("/");
    
    // 4.重置文件權(quán)限掩碼
    umask(0);
    
    // 5.關(guān)閉不需要的文件描述符以供后續(xù)使用
    max_fd = 3;     // 打開的最大文件描述符
    for(i = 0; i < max_fd; i++)
        close(i);
    
    // 以下為守護(hù)進(jìn)程的具體執(zhí)行代碼
    int fd = open("/home/vicliu/daemon.log", O_APPEND | O_CREAT, 0644);
    char *p = "hello shangqian!"; 
    while(_running)
    {
        write(fd, p, strlen(p));
    }
    close(fd);

    return 0;
}
// 通過(guò)主機(jī)名稱獲取主機(jī)的詳細(xì)信息

// struct hostent *gethostbyname(const char *name);
// 參數(shù):主機(jī)名稱
// 返回值:主機(jī)信息結(jié)構(gòu)體

#include <stdio.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    // 通過(guò)命令行參數(shù)傳入主機(jī)名稱
    if(argc != 2)
    {
        printf("usage : %s <host_name>\n", argv[0]);
        return 0;
    }

    int i = 0;
    struct hostent *p = gethostbyname(argv[1]);
    struct in_addr *q = NULL;
    
    // 分析結(jié)構(gòu)體數(shù)據(jù)并打印
    // 1.打印官方名稱
    printf("official name : %s\n", p->h_name);
    
    // 2.打印別名列表
    while(p->h_aliases[i] != NULL)
    {
        printf("aliases[%d] : %s\n", i, p->h_aliases[i]);
        i++;
    }
    
    // 3.打印地址類型
    if(p->h_addrtype == AF_INET)
    {
        printf("addr type : AF_INET\n");
    }
    else if(p->h_addrtype == AF_INET6)
    {
        printf("addr type : AF_INET6\n");
    }
    
    // 4.打印地址長(zhǎng)度
    printf("addr length : %d\n", p->h_length);
    
    // 5.打印IP地址列表
    i = 0;
    while(p->h_addr_list[i] != NULL)
    {
        q = (struct in_addr *)p->h_addr_list[i];
        printf("addr list[%d] : %s\n", i, inet_ntoa(*q));
        i++;
    }
    
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容