linux之守护进程与操作编程

    xiaoxiao2021-04-14  39

    ---常见守护进程 (1)syslogd,系统日志守护进程,提供syslog功能。 (2)cron,cron进程用来实现操作系统的时间管理,linux中实现定时执行程序的功能就要用到cron。 ---编写简单守护进程 ---任何一个进程都可以将自己实现成守护进程 ---create_daemon函数要素 (1)子进程等待父进程退出 (2)子进程使用setsid创建新的会话期,脱离控制台 (3)调用chdir将当前工作目录设置为/ (4)umask设置为0以取消任何文件权限屏蔽 (5)关闭所有文件描述符 (6)将0、1、2定位到/dev/null #include <sys/stat.h>#include <fcntl.h> void create_daemon(void); int main(void){ create_daemon(); while (1) { printf("I am running.\n"); sleep(1); } return 0;} // 函数作用就是把调用该函数的进程变成一个守护进程void create_daemon(void){ pid_t pid = 0; pid = fork(); if (pid < 0) { perror("fork"); exit(-1); } if (pid > 0) { exit(0); // 父进程直接退出 } // 执行到这里就是子进程 // setsid将当前进程设置为一个新的会话期session,目的就是让当前进程 // 脱离控制台。 pid = setsid(); if (pid < 0) { perror("setsid"); exit(-1); } // 将当前进程工作目录设置为根目录 chdir("/"); // umask设置为0确保将来进程有最大的文件操作权限 umask(0); // 关闭所有文件描述符 // 先要获取当前系统中所允许打开的最大文件描述符数目 int cnt = sysconf(_SC_OPEN_MAX); int i = 0; for (i=0; i<cnt; i++) { close(i); } open("/dev/null", O_RDWR); //标准输入、  0 open("/dev/null", O_RDWR); //标准输出、  1  open("/dev/null", O_RDWR); //标准错误、   2} ---使用syslog来记录调试信息 ---编程实战 (1)一般log信息都在操作系统的/var/log/messages这个文件中存储着,但是ubuntu中是在/var/log/syslog文件中的。 ---syslog的工作原理 (1)操作系统中有一个守护进程syslogd(开机运行,关机时才结束),这个守护进程syslogd负责进行日志文件的写入和维护。 (2)syslogd是独立于我们任意一个进程而运行的。我们当前进程和syslogd进程本来是没有任何关系的,但是我们当前进程可以通过调用openlog打开一个和syslogd相连接的通道,然后通过syslog向syslogd发消息,然后由syslogd来将其写入到日志文件系统中。 (3)syslogd其实就是一个日志文件系统的服务器进程,提供日志服务。任何需要写日志的进程都可以通过openlog/syslog/closelog这三个函数来利用syslogd提供的日志服务。这就是操作系统的服务式的设计。 void openlog(const char *ident, int option, int facility); //打开日志 void syslog(int priority, const char *format, ...); //写日志 // 一般在/var/log/messages这个文件  //ubuntu在/var/log/syslog文件 void closelog(void);         //关闭日志 * ident: NULL                直接就是当前程序的名字 option: LOG_CONS //往日志里写的时候,如果出现错误,直接把信息输出到控制台 LOG_PID //在往日志发的每一条信息都带PID,为了区分父进程还是子进程的信息 facility: LOG_AUTH security/authorization messages安全相关 LOG_CRON clock daemon (cron and at)时间相关 LOG_FTP        ftp daemon FTP相关 LOG_USER(默认)generic user-level messages 普通的,一般的信息 priority: LOG_EMERG system is unusableLOG_ALERT action must be taken immediatelyLOG_CRIT critical conditionsLOG_ERR error conditionsLOG_WARNING warning conditionsLOG_NOTICE normal, but significant, conditionLOG_INFO informational messageLOG_DEBUG debug-level message openlog("b.out", LOG_PID | LOG_CONS, LOG_USER); syslog(LOG_INFO, "this is my log info.%d", 23); syslog(LOG_INFO, "this is another log info."); syslog(LOG_INFO, "this is 3th log info."); closelog();
    转载请注明原文地址: https://ju.6miu.com/read-669965.html

    最新回复(0)