您的位置:首页 > 其它

创建守护进程记录时间.c

2017-01-05 23:02 113 查看
/* 创建1个守护进程,用来记录时间到指定文件
 * 守护进程的定义:不 依附于终端的程序,和僵尸程序的区别:僵尸程序是子进程先死父进程未回收,父进程未死时,其子进程不可被init接收故不可被杀死,守护进程是父进程先死,init接收子进程,子进程可被杀死
 */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <syslog.h> //openlog使用
#include <time.h> //time使用

#define FILE_NAME "/tmp/timer_recorders.txt" //定义文件位置,一般定义在/tmp,守护进程的日志要求不能随意被查看修改,程序运行之后可以在该目录下查看生成文件

int main(void) {
    int ret;
    int i;
    int fd;
    time_t cur_time;
    
    char *info;

//创建孤儿进程
    ret = fork();
    if (ret < 0)   
    {
        perror("fork error.");
        exit(1);
    } else if (ret > 0) //父进程直接退出
    {
        exit(0);
    }

//创建新会话,以使该孤儿进程脱离控制台、当前会话,否则该孤儿进程依然可能随终端退出而结束
     setsid();

// 改变当前工作目录
    chdir("/tmp");

//改变文件权限掩码,umask和chmod正好相反,设置为0表示可读可写可执行
    umask(0);

//关闭所有文件描述符,子进程会通过父进程继承一些列打开的文件,而守护进程本身不可以也不可被操作,所以应该关闭其他文件和输入输出(创建新会话后守护进程已经和所属的控制终端失去联系,所以可以同时关闭终端的读写),已减少进程的开销
    for (i=0; i<getdtablesize(); i++) {
        close(i);
    }
    fd = open(FILE_NAME, O_WRONLY|O_CREAT, 0666);
    while (1) {
        //获取当前时间
        time(&cur_time);
        //把当前时间cur_time转换为字符串
        info = ctime(&cur_time);
        //把时间字符串信息写入文件
        ret = write(fd, info, strlen(info));
        sleep(5);
    }

    return 0;
}
//这里没有做成功性判断是因为守护进程在后台运行是不会打印信息出来的,如果想要知道有没有创建成功,只能用sys_log(系统日志服务),这里就不写了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: