// 创建一个守护进程每间隔10秒向当前目录下的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子进程,父进程退出
if((pid = fork()) > 0)
{
exit(0);
}
// 2.创建新会话,使得子进程脱离了原来的控制终端,会话期,进程组
setsid();
// 3.改变工作目录为不可卸载之目录
chdir("/");
// 4.重置文件权限掩码
umask(0);
// 5.关闭不需要的文件描述符以供后续使用
max_fd = 3; // 打开的最大文件描述符
for(i = 0; i < max_fd; i++)
close(i);
// 以下为守护进程的具体执行代码
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;
}
// 通过主机名称获取主机的详细信息
// struct hostent *gethostbyname(const char *name);
// 参数:主机名称
// 返回值:主机信息结构体
#include <stdio.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
// 通过命令行参数传入主机名称
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;
// 分析结构体数据并打印
// 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.打印地址长度
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;
}