进程的关系:1.每个进程都有一个进程组2.每个进程组都有一个首领进程, 其 pig 等于 pgid3.一个进程只能设置自己活着子进程的 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