一. 进程实际用户标志符和有效用户标志符
每个进程都有一个实际用户标识符和一个实际组标识符,它们永远是启动该进程之用户的用户标识符和组标识符。
进程的有效用户标识符和有效组标识符也许更重要些,它们被用来确定一个用户能否访问某个确定的文件。在通常情况下,它们与实际用户标识符和实际组标识符是一致的。但是,一个进程或其祖先进程可以设置程序文件的置用户标识符权限或置组标识符权限。这样,当通过exec 调用执行该程序时,其进程的有效用户标识符就取自该文件的文件主的
有效用户标识符,而不是启动该进程的用户的有效用户标识符。
二. 进程的优先级
系统以整型变量nice 为基础,来决定一个特定进程可得到的CPU 时间的比例。nice 之值从0 至其最大值。我们把nice 值称为进程的优先数。进程的优先数越大,其优先权就越低。普通进程可以使用系统调用nice()来降低它的优先权,以把更多的资源分给其它进程。具体的做法是给系统调用nice 的参数定一个正数,nice()调用将其加到当前的nice 值上。
例如:
#include <unistd.h>
nice(5);
这就使当前的优先数增加了5,显然,其对应进程的优先权降低了。
超级用户可以用系统调用nice()增加优先权,这时只需给nice()一个负值的参数,如:
nice(-1);
三. 守护进程
守护进程是一种后台运行并且独立于所有终端控制之外的进程。UNIX/Linux 系统通常有许多的守护进程,它们执行着各种系统服务和管理的任务。
为什么需要有独立于终端之外的进程呢?首先,处于安全性的考虑我们不希望这些进程在执行中的信息在任何一个终端上显示。其次,我们也不希望这些进程被终端所产生的中断信号所打断。最后,虽然我们可以通过&将程序转为后台执行,我们有时也会需要程序能够自动将其转入后台执行。因此,我们需要守护进程。
启动一个守护进程,可以采取以下的几种方式:
1.在系统期间通过系统的初始化脚本启动守护进程。这些脚本通常在目录etc/rc.d 下,通过它们所启动的守护进程具有超级用户的权限。系统的一些基本服务程序通常都是通过这种方式启动的。
2.很多网络服务程序是由inetd 守护程序启动的。在后面的章节中我们还会讲到它。它监听各种网络请求,如telnet、ftp 等,在请求到达时启动相应的服务器程序(telnet server、ftp server 等)。
3.由cron 定时启动的处理程序。这些程序在运行时实际上也是一个守护进程。
4.由at 启动的处理程序。
5.守护程序也可以从终端启动,通常这种方式只用于守护进程的测试,或者是重起因某种原因而停止的进程。
6.在终端上用nohup 启动的进程。用这种方法可以把所有的程序都变为守护进程,但在本节中我们不予讨论。
守护进程的建立的例子
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <syslog.h>
#define MAXFD 64
void daemon_init(const char *pname, int facility)
{
int i:
pid_t pid;
/* fork,终止父进程 */
if (pid=fork())
exit(0);
/* 第一子进程 */
setsid();
signal(SIGHUP,SIG_IGN);
/* fork,终止第一子进程 */
if (pid=fork())
exit(0);
/* 第二子进程 */
daemon_proc=1;
/* 将工作目录设定为"/" */
chdir("/");
/* 清除文件掩码 */
umask(0);
/* 关闭所有文件句柄 */
for (i=0;i<MAXFD;i++)
{
close(i);
}
/* 打开log */
openlog(pname,LOG_PID,facility);
}
建立一个守护进程需要进行哪些操作:
1.fork
首先需要fork 一个子进程并将父进程关闭。如果进程是作为一个shell 命令在命令行上前台启动的,当父进程终止时,shell 就认为该命令已经结束。这样子进程就自动称为了后台进程。而且,子进程从父进程那里继承了组标识符同时又拥有了自己的进程标识符,这样保证了子进程不会是一个进程组的首进程。这一点是下一步setsid 所必须的。
2.setsid
setsid()调用创建了一个新的进程组,调用进程成为了该进程组的首进程。这样,就使该进程脱离了原来的终端,成为了独立于终端外的进程。
3.忽略SIGHUP 信号,重新fork这样使进程不在是进程组的首进程,可以防止在某些情况下进程意外的打开终端而重
新与终端发生联系。
4.改变工作目录,清除文件掩码
改变工作目录主要是为了切断进程与原有文件系统的联系。并且保证无论从什么地方启动进程都能正常的工作。清除文件掩码是为了消除进程自身掩码对其创建文件的影响。
5.关闭全部已打开的文件句柄
这是为了防止子进程继承了在父进程中打开的文件而使这些文件始终保持打开从而产生某些冲突。
6.打开log 系统
以上就是建立一个守护进程的基本步骤。当然,一个实际的守护进程要比这个例子复杂许多,但是万变不离其宗,原理都是相同的。通过上面几步,我们可以正确的建立自己的守护进程。
分享到:
相关推荐
Linux是一个开放源代码的操作系统,因此,它提供了丰富的网络编程接口和库函数,可以方便地实现网络通信。 Linux网络编程主要涉及以下内容: Socket编程:Socket是用于实现网络通信的编程接口,支持基于TCP/IP协议...
TCP(Transfer Control Protocol)传输控制协议是一种面向连接的协议,当我们的网络程 序使用 这个协议的时候,网络可以保证我们的客户端和服务端的连接是可靠的,安全的. UDP(User Datagram Protocol)用户数据报协议...
Linux系统编程是指在Linux操作...这种编程涉及到与 Linux 操作系统核心交互,以实现各种功能,如文件操作、进程管理、网络通信等。Linux 系统编程通常需要直接调用系统调用,使用 C 或 C++ 等低级编程语言进行开发。
本人学习 Linux进程编程时整理的,介绍Linux进程的创建,到守护进程的创建步骤。还有有关进程控制的参考资料
呕心沥血一周,超级详细的Linux网络编程笔记,包括TCP/IP通信客户端与服务器端的源码,TCP/IP的思维导图,分享给有需要的小伙伴
linux,基本使用,i/o,进程,线程,网络编程
用户级内存管理 简单的文件I/O 进程管理 串口 Socket
如果你想要成为一名合格的Linux管理员linux学习书籍,那么必须要学习一些基础知识和技能。...该书主要介绍Unix环境下高级编程的相关知识,如进程控制、信号处理、文件IO等。 3.《深入理解Linux内核》
笔记_Linux编程 内容,linux下文件读取方法 Open,write close 与C标准库的fopen,fwrite,fclose区别: 1\write不用关闭即写入到文件,没有缓冲区,比较低级的操作方式。Fwrite有缓冲区,所以fwrite更高效。不用总是写...
本书作者在整理自己多年研发笔记的基础上,以精心挑选的典型开发实例,向读者详细讲述了Linux内核源代码的各部分结构、原理及组成框架,主要分析了 Linux最新版本(2.6.11)的内核源代码,帮助读者深入理解Linux内核...
linux进程线程编程的学习笔记整理!继《linux的IO编程》的第二个大的部分——进程和线程的编程,后序还有《linux的网络编程》正在整理中……
本书作者在整理自己多年研发笔记的基础上,以精心挑选的典型开发实例,向读者详细讲述了Linux内核源代码的各部分结构、原理及组成框架,主要分析了 Linux最新版本(2.6.11)的内核源代码,帮助读者深入理解Linux内核...
启动 常用工具 系统安装配置 管理脚本语言 数据库 网络服务 安全 gcc socket编程 文件和设备编程 进程和线程编程 内核分析: 启动 中断 内存 进程 网络 系统调用 文件系统 驱动 经验 项目专题: LFYOS OSKit ...
本书作者在整理自己多年研发笔记的基础上,以精心挑选的典型开发实例,向读者详细讲述了Linux内核源代码的各部分结构、原理及组成框架,主要分析了 Linux最新版本(2.6.11)的内核源代码,帮助读者深入理解Linux内核...
LINUX下环境高级编程整理笔记,里面含有文件系统操作与进程的介绍与运用,还有高级IO的操作
一、初识 Linux shell Linux 系统可划分为以下 4 部分。 Linux 内核 GNU 工具 图形化桌面环境 应用软件 内核主要负责以下 4 种功能。 系统内存管理 内核通过硬盘上称为交换空间(swap space)的存储区域来实现虚拟...
Linux Cpp 后台开发进阶学习 本项目用于Linux Cpp后台开发秋招学习,内容主要涵盖以下几个部分:Cpp进阶,操作系统, 计算机网络, Linux内核,...Linux 系统编程(一)Linux开发环境+Visual Studio Code配置
第一阶段在PC机上学习熟悉Linux. 一.Red Hat Linux 9下的常用操作… ………………… 二.Minicom的使用….… 三.NFS的使用… … 四.应用程序编程实验…… 五.模块编程实验…… 六.简单的字符设备驱动实验…… 第二...
一、实验名称:Linux下C编程 二、实验类型:设计 三、实验目的: 1. 熟练掌握Linux下c的编译器gcc 2. 熟练掌握Linux下c的调试器gdb 3. 熟练掌握Linux下make用法 4. 熟悉Linux下使用c对进程操作 5. 熟悉Linux下...