linux高性能服务器编程---第七章Linux服务器程序规范
- Linux程序服务器 一般以后台进程形式运行. 后台进程又称为守护进程(daemon). 他没有控制终端, 因而不会意外的接收到用户输入. 守护进程的父进程通常都是init进程(PID为1的进程)
- Linux服务器程序有一套日志系统, 他至少能输出日志到文件. 日志这东西太重要了,排错对比全靠它.
- Linux服务器程序一般以某个专门的非root身份运行. 比如mysqld有自己的账户mysql.
- Linux服务器程序一般都有自己的配置文件, 而不是把所有配置都写死在代码里面, 方便后续的更改.
- Linux服务器程序通常在启动的时候生成一个PID文件并存入/var/run 目录中, 以记录改后台进程的PID.
- Linux服务器程序通常需要考虑系统资源和限制, 预测自己的承受能力
日志
sudo service rsyslog restart // 启动守护进程
#include <syslog.h> // priority参数是所谓的设施值(记录日志信息来源, 默认为LOG_USER)与日志级别的按位或 // - 0 LOG_EMERG /* 系统不可用*/ // - 1 LOG_ALERT /* 报警需要立即采取行动*/ // - 2 LOG_CRIT /* 非常严重的情况*/ // - 3 LOG_ERR /* 错误*/ // - 4 LOG_WARNING /* 警告*/ // - 5 LOG_NOTICE /* 通知*/ // - 6 LOG_INFO /* 信息*/ // -7 LOG_DEBUG /* 调试*/ void syslog(int priority, const char* message, .....); // ident 位于日志的时间后 通常为名字 // logopt 对后续 syslog调用的行为进行配置 // - 0x01 LOG_PID /* 在日志信息中包含程序PID*/ // - 0x02 LOG_CONS /* 如果信息不能记录到日志文件, 则打印到终端*/ // - 0x04 LOG_ODELAY /* 延迟打开日志功能直到第一次调用syslog*/ // - 0x08 LOG_NDELAY /* 不延迟打开日志功能*/ // facility参数可以修改syslog函数中的默认设施值 void openlog(const char* ident, int logopt, int facility); // maskpri 一共八位 0000-0000 // 如果将最后一个0置为1 表示 记录0级别的日志 // 如果将最后两个0都置为1 表示记录0和1级别的日志 // 可以通过LOG_MASK() 宏设定 比如LOG_MASK(LOG_CRIT) 表示将倒数第三个0置为1, 表示只记录LOG_CRIT // 如果直接设置setlogmask(3); 3的二进制最后两个数均为1 则记录 0和1级别的日志 int setlogmask(int maskpri); // 关闭日志功能 void closelog();
用户信息, 切换用户
UID - 真实用户ID EUID - 有效用户ID - 方便资源访问 GID - 真实组ID EGID - 有效组ID
#include <sys/types.h> #include <unistd.h> uid_t getuid(); uid_t geteuid(); gid_t getgid(); gid_t getegid(); int setuid(uid_t uid); int seteuid(uid_t euid); int setgid(gid_t gid); int setegid(gid_t gid);
可以通过 setuid
和setgid
切换用户 root用户uid和gid均为0
进程间关系
PGID - 进程组ID(Linux下每个进程隶属于一个进程组)
#include <unistd.h> pid_t getpgid(pid_t pid); 成功时返回pid所属的pgid 失败返回-1 int setpgid(pid_t pid, pid_t pgid);
会话 一些有关联的进程组将形成一个会话 略过
查看进程关系 ps和less