不仅网路通讯外,服务器程序还必须考虑许多其他细节问题,零碎,但基本上都是模板式的。———引

01

日志

1.Linux系统日志:

2.syslog()

应用程序使用syslog()与守护进程rsyslogd通讯。

该函数采用可变参数(第二个参数message和第三个参数。。。)来结构化输出。

priority:设施值(按位异或)日志级别。设施值默认:LOG_USER,下边针对默认设施值,讨论日志级别。

linux游戏服务器开发_Linux服务器程序开发_服务器程序日志管理

2.1下边这个函数可以改变syslog的默认输出方法,进一步结构化日志内容

(1)ident:指定字符串将被添加到日志消息的日期和时间以后,一般设为程序的名子。

(2)logopt:对后续syslog调用的行为进行配置,它可取下述值的按位异或

(3)facility:拿来更改ysyslog默认设施值

据悉,日志过滤也很重要,程序再开发阶段可能须要输出好多调试信息,而发布以后,我们又要将这种调试信息关掉,解决这个问题的方式并不是再程序发布以后,删掉调试代码(日后可能就会用到),而是追捕但地设置日志网段,使日志级别小于日志网段的日志被系统忽视。

2.2下边这个函数用于设置syslog的日志网段。

maskpri:指定日志网段值,该函数仍然回成功linux是什么,它返回调用进程原本的日志网段值。

2.3关掉日志功能:

02

用户信息

1.UID,EUID,GID,EGID

用户信息对于服务器安全很重要,大多劝说务器以root启动,非root运行

Linux服务器程序开发_linux游戏服务器开发_服务器程序日志管理

基础知识:

一个进程拥有两个用户ID,UID,EUID,EUID存在的目的是为了便捷资源的访问,它促使运行程序的用户拥有该程序的有效用户权限,例如,su拿来修改帐户信息linux游戏服务器开发,但更改帐户时su程序的所有者是root,在普通用户运行su程序时,其有效用户就是该程序的所有者root,有效用户为root的进程称为特权进程,EGID与EUID类似,下边演示uid,euid区别:

linux游戏服务器开发_Linux服务器程序开发_服务器程序日志管理

将生成的可执行文件,所有者设置为root,并设置该文件set-user-id标志,之后运行。

从测试输出结果看,进程的uid是启动程序的用户id,而euid是root。

2.切换用户

Linux服务器程序开发_linux游戏服务器开发_服务器程序日志管理

03

进程间关系

1.进程组:

Linux下每一个进程都属于一个进程组,为此她们不仅pid之外linux系统编程,还有进程组ID(PGID)。我们用如下函数获取指定进程组PGID.

成功返回pid,失败-1,设置errno。

假如pid与pgid相同,则由pid指定的进程别设置为进程组首领:假如pid为0,表示当前进程的PGID为pgid;假如pgid为0,则使用pid作为目标pgid。setpid函数成功时返回0,失败-1,设置errno。一个进程只能设置自己或则其子进程的PGID。而且,当子进程调用exec系列函数后,我们也不能再在父进程中对他设置PGID。

2.会话

(1)一些有关联的进程将组成一个会话,下边的函数用于创建一个会话:

该函数不能由进程组的首领进程调用,否则将形成一个错误。对于非首领的进程,调用该函数除了创建新会话,并且有如下额外疗效。

调用进程成为会话的首领,此时该进程时新会话的惟一成员。新建一个进程组,其PGID就是调用进程的PID,调用进程成为该组的首领。调用进程将甩开终端(假如有)

该函数成功时返回新的进程组PGID,失败-1,errno。Linux进程并未提供所谓会话ID的概念,但Linux系统觉得它等于会话首领所在的进程组的PGID,(2)并提供了如下函数读取SID

3.用ps命令查看进程关系

执行ps命令可查看进程linux游戏服务器开发,进程组和会话之间的关系。

在bash_shell下执行ps和less命令,所以ps和less命令的父进程时bash命令,这个可以从PPID(父进程PID)一列看出。这三条命令创建了一个会话(SID是2962)和两个进程组(PGID:2962,3102)bash命令的PID,PGID和SID都相同,其实它时会话的首领,也就是组2962的首领。ps时3102的首领,

linux游戏服务器开发_Linux服务器程序开发_服务器程序日志管理

04

系统资源限制

Linux上运行的程序就会遭到资源限制的影响,例如化学设备限制(cpu数目,显存数目等),系统策略限制(cup时间等),以及具体实现的限制(文件名最大宽度)Linux系统资源限制可以通过如下一对函数来读取和设置:getrlimit,setrlimit

rlimit结构体定义如下:

Linux服务器程序开发_服务器程序日志管理_linux游戏服务器开发

成功返回0,失败-1,置errno

rlim_t是一个整数类型,它描述资源级别

rlim_cur成员指定资源的软限制,建议性的,最好不要赶超的限制,假如赶超,系统可能向进程发送讯号,并中止运行,假如当前进程CPU时间超过软限制,系统将向进程发送SIGXCPU讯号;当文件规格超过其软限制时,系统将向进程发送SIZEXFSZ讯号。rlim_max成员指定资源的硬限制。硬限制通常是软限制的上限,普通程序可以减小应限制,而只有以root身分运行的程序能够降低硬限制,再者我们可以使用ulimit命令更改当前shell环境下的资源限制(软/硬)这些更改对该shell启动的所有后续程序都有效,我们也可以通过更改配置文件来改变系统软限制和应限制,而这些更改时永久的。

resource参数指定资源限制类型。如下表

Linux服务器程序开发_服务器程序日志管理_linux游戏服务器开发

05

改变工作目录和根目录

有些服务器程序好须要改变工作目录和根目录(web/var/www)获取当前进程工作目录和改变进程的工作目录的函数:

服务器程序日志管理_Linux服务器程序开发_linux游戏服务器开发

buf参数指向的显存用于储存当前工作目录的绝对路径,size指定其大小

假如当前目录的绝对路径超拔(+1(‘’))超过了size,则getcwd返回NULL,errno:ERANG。

chdir中path指向要切换到的目录。成功0,失败-1置errno。

改变进程根目录:chroot

chroot并不改变进程的当前工作目录,调用chroot以后,仍须要调用chdir(“/”)来将工作转至新的工作目录,然后原先的文件描述符仍然生效。所以可以借助先前打开的文件描述符来访问调用chroot以后不能直接访问的文件(目录).

06

服务器程序后台化

最后,怎样在代码中让一个进程以守护进程的避免运行,守护进程的编撰遵守一定的步骤,下边一个实例。

Linux服务器程序开发_服务器程序日志管理_linux游戏服务器开发

实际上,linux提供了完成同样功能的库函数:

nochdir:传0则工作目录将被设置为”/”,否则继续使用当前工作目录。noclose:传0标准输入输出,标准错误输出都被重定向到,dev/null,否则继续使用原先的设备,成功0,失败-1置error。

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复