linux之守护进程与操作编程

来源:互联网 发布:nginx rtmp hls 编辑:程序博客网 时间:2024/05/21 15:46
---常见守护进程
(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
  1. #include <sys/stat.h>
  2. #include <fcntl.h>
  3. void create_daemon(void);
  4. int main(void)
  5. {
  6. create_daemon();
  7. while (1)
  8. {
  9. printf("I am running.\n");
  10. sleep(1);
  11. }
  12. return 0;
  13. }
  14. // 函数作用就是把调用该函数的进程变成一个守护进程
  15. void create_daemon(void)
  16. {
  17. pid_t pid = 0;
  18. pid = fork();
  19. if (pid < 0)
  20. {
  21. perror("fork");
  22. exit(-1);
  23. }
  24. if (pid > 0)
  25. {
  26. exit(0);// 父进程直接退出
  27. }
  28. // 执行到这里就是子进程
  29. // setsid将当前进程设置为一个新的会话期session,目的就是让当前进程
  30. // 脱离控制台。
  31. pid = setsid();
  32. if (pid < 0)
  33. {
  34. perror("setsid");
  35. exit(-1);
  36. }
  37. // 将当前进程工作目录设置为根目录
  38. chdir("/");
  39. // umask设置为0确保将来进程有最大的文件操作权限
  40. umask(0);
  41. // 关闭所有文件描述符
  42. // 先要获取当前系统中所允许打开的最大文件描述符数目
  43. int cnt = sysconf(_SC_OPEN_MAX);
  44. int i = 0;
  45. for (i=0; i<cnt; i++)
  46. {
  47. close(i);
  48. }
  49. open("/dev/null", O_RDWR); //标准输入、  0
  50. open("/dev/null", O_RDWR); //标准输出、  1 
  51. open("/dev/null", O_RDWR); //标准错误、   2
  52. }

---使用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提供的日志服务。这就是操作系统的服务式的设计。
  1. void openlog(const char *ident, int option, int facility); //打开日志
  2. void syslog(int priority, const char *format, ...); //写日志 // 一般在/var/log/messages这个文件  //ubuntu在/var/log/syslog文件
  3. 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
  1. openlog("b.out", LOG_PID | LOG_CONS, LOG_USER);
  2. syslog(LOG_INFO, "this is my log info.%d", 23);
  3. syslog(LOG_INFO, "this is another log info.");
  4. syslog(LOG_INFO, "this is 3th log info.");
  5. closelog();
0 0
原创粉丝点击