史上最全Linux服务器程序规范( 二 )



史上最全Linux服务器程序规范

文章插图
 
将生成的可执行文件,所有者设置为root,并设置该文件set-user-id标志,然后运行 。
测试输出结果看,进程的uid是启动程序的用户id, 而euid是root 。
2.切换用户
史上最全Linux服务器程序规范

文章插图
 
03
进程间关系
1.进程组:
Linux下每一个进程都属于一个进程组,因此他们除了pid之外,还有进程组ID(PGID) 。我们用如下函数获取指定进程组PGID.
史上最全Linux服务器程序规范

文章插图
 
成功返回pid, 失败-1,设置errno 。
如果pid与pgid相同,则由pid指定的进程别设置为进程组首领:如果pid为0, 表示当前进程的PGID为pgid;如果pgid为0, 则使用pid作为目标pgid 。setpid函数成功时返回0, 失败-1, 设置errno 。一个进程只能设置自己或者其子进程的PGID 。并且, 当子进程调用exec系列函数后,我们也不能再在父进程中对他设置PGID 。
2.会话
(1)一些有关联的进程将组成一个会话, 下面的函数用于创建一个会话:
史上最全Linux服务器程序规范

文章插图
 
该函数不能由进程组的首领进程调用,否则将产生一个错误 。对于非首领的进程, 调用该函数不仅创建新会话, 而且有如下额外效果 。
调用进程成为会话的首领,此时该进程时新会话的唯一成员 。新建一个进程组,其PGID就是调用进程的PID, 调用进程成为该组的首领 。调用进程将甩开终端(如果有)
该函数成功时返回新的进程组PGID, 失败-1, errno 。Linux进程并未提供所谓会话ID的概念, 但Linux系统认为它等于会话首领所在的进程组的PGID, (2)并提供了如下函数读取SID
史上最全Linux服务器程序规范

文章插图
 
3.用ps命令查看进程关系
执行ps命令可查看进程,进程组和会话之间的关系 。
在bash_shell 下执行ps和less命令,所以ps和less命令的父进程时bash命令,这个可以从PPID(父进程PID)一列看出 。这三条命令创建了一个会话(SID是2962)和两个进程组(PGID:2962, 3102)bash命令的PID,PGID和SID都相同,显然它时会话的首领, 也就是组2962的首领 。ps时3102的首领,
史上最全Linux服务器程序规范

文章插图
 
04
系统资源限制
Linux上运行的程序都会受到资源限制的影响,比如物理设备限制(cpu数量,内存数量等),系统策略限制(cup时间等),以及具体实现的限制(文件名最大长度)Linux系统资源限制可以通过如下一对函数来读取和设置: getrlimit , setrlimit

史上最全Linux服务器程序规范

文章插图
 
rlimit 结构体定义如下:
史上最全Linux服务器程序规范

文章插图
 
成功返回0, 失败-1, 置errno
rlim_t 是一个整数类型,它描述资源级别
rlim_cur 成员指定资源的软限制,建议性的,最好不要超越的限制,如果超越,系统可能向进程发送信号,并终止运行,如果当前进程CPU时间超过软限制,系统将向进程发送SIGXCPU信号;当文件尺寸超过其软限制时,系统将向进程发送SIZEXFSZ信号 。 rlim_max 成员指定资源的硬限制 。硬限制一般是软限制的上限,普通程序可以减小应限制,而只有以root身份运行的程序才能增加硬限制,此外我们可以使用ulimit命令修改当前shell环境下的资源限制(软/硬)这种修改对该shell启动的所有后续程序都有效,我们也可以通过修改配置文件来改变系统软限制和应限制,而这种修改时永久的 。
resource参数指定资源限制类型 。如下表
史上最全Linux服务器程序规范

文章插图
 
05
改变工作目录和根目录
有些服务器程序好需要改变工作目录和根目录(web /var/www) 获取当前进程工作目录和改变进程的工作目录的函数:
史上最全Linux服务器程序规范

文章插图
 
buf参数指向的内存用于存储当前工作目录的绝对路径,size指定其大小
如果当前目录的绝对路径超度(+1 (‘’))超过了size,则getcwd返回NULL,errno:ERANG 。


推荐阅读