进程的关系:
1.每个进程都有一个进程组
2.每个进程组都有一个首领进程, 其 pig 等于 pgid
3.一个进程只能设置自己活着子进程的 PGID , 执行 exec 后,父进程也不能对子进程设置
setsid() 函数效果:
1.调用进程称为会话首领,此时该进程是新会话的唯一成员
2.创建一个进程组,其 PGID 就是调用进程ID,该调用进程称为该组的首领
3.调用进程将甩开终端
有关联的进程组将形成一个会话
软限制 : 发出警告,普通进程
硬限制 : 软限制的上线,一般是 root 身份运行的程序
服务器程序后台化:
1.创建子进程,关闭父进程
2.设置文件权限的掩码
3.创建新的会话,设置本进程未进程组的首领
4.切换工作目录
5.关闭标准输入设备,标准输出设备和标准错误输出设备
6.关闭其他已经打开的文件描述符
7.将标准输入,标准输出,标准错误重定向到 /dev/null 文件
Linux 服务器程序规范
1.后台进程又称为守护进程。它没有控制终端,因而也不会意外的收到用户输入。
2.Linux服务器程序通常有一套日志系统,大部分后台进程都在 /var/log目录下拥有自己的日志目录
3.Linux服务器程序一般以某个专门的非 root 身份运行。
4.Linux服务器程序通常是可配置的,在 /etc 下
5.Linux服务器程序通常会在启动的时候生成一个PID文件并存入 /var/run目录中,以记录该后台进程的PID。
6.Linux服务器程序通常需要考虑系统资源和限制,以预测自身能够承受多大的负荷。
syslog();
openlog();
setlogmask();
closelog();
用户信息:UID,EUID(有效用户),GID 和 EGID(有效组ID)
用户信息对于服务器程序的安全性来说是很重要的,比如大部分服务器就必须以root身份启动,但不能以root身份运行。
getuid();
geteuid();
getgid();
getegid();
setuid();
seteuid();
setgid();
setegid();
需要指出的是,一个进程拥有2个用户ID:UID 和 EUID。EUID存在的目的是方便资源访问:它使得运行程序的用户拥有该程序的有效用户的权限。
进程间的关系:
Linux下每个进程都属于一个进程组,因此他们除了PID信息外,还有进程组ID(PGID)。
getpgid();
每个进程组都有一个首领进程,其PGID和 PID相同,进程组将一直存在,直到其中所有的进程都退出,或者加入到其他进程组。
setpgid();
一个进程只能设置自己或者其他子进程的PGID。并且,子进程调用 exec 系统函数后,我们也不能再在父进程中对它设置PGID。
会话:
一些有关联的进程组将形成一个会话。
setsid();
该函数不能由进程组的首领进程调用,否则将产生一个错误。对于非首领进程,调用该函数不仅创建新会话,而且还有如下额外效果:
1.调用进程称为会话的首领,此进程是新会话的唯一成员
2.新建一个进程组,其PGID就是调用进程的PID,调用进程称为该组的首领
3.调用进程将甩开终端
ps -o pid,ppid,pgid,sid,comm
系统资源限制:
Linux上运行的程序会收到资源限制的影响。
getrlimit();
setrlimit();
软限制是一个建议性的,最好不要超越的限制。如果超越的话,系统可能会向进程发送信号以终止其运行。
硬限制一般是软限制的上线,普通程序可以减少硬限制,而只有root身份运行的程序才能增加硬限制。
此外,我们可以使用ulimit命令修改当前shell环境下的资源限制(软限制或者硬限制),这种修改对该 shell 启动的所有后续程序有效。我们也可以通过
修改配置文件来改变系统软限制和硬限制,而且这种修改是永久有效的。
改变工作目录和根目录:
getcwd();
chdir();
chroot();//改变进程根目录
服务器程序后台化:
1.创建子进程,关闭父进程
fork();
2.设置文件权限掩码
umask();
3.创建新的会话,设置本进程未进程组的首领
setsid();
4.切换根目录
chdir();
5.关闭标准输入输出
close(STDIN_FILENO);
6.将标准输入输出都重定向到 /dev/null
7.1 日志
7.2 用户信息
7.3 进程间的关系
7.4 系统资源限制
7.5 改变工作目录和根目录
7.6 服务器程序后台化