[linux c]Linux 系统守护进程实验

简介:

原理

一、setsid();

VFS 层系统调用

int sys_setsid(void)
{
       ...
       current->leader = 1;
       current->session = current->pgrd = current->pid;
       current->tty = -1;    //表示该领头进程没有控制终端。
       ...
}


说明:当进程是会话的领头进程时setsid()调用失败并返回(-1)。setsid()调用成功后,返回新的会话的ID,调用setsid函数的进程成为新的会话的领头进程,并与其父进程的会话组和进程组脱离。由于会话对控制终端的独占性,进程同时与控制终端脱离。

pid_t pid = fork();              //fork a process

if (pid < 0)      exit(0);          //fork error

if (pid > 0)   exit(0);             //father process exit

setsid();[1]                         //creat a new  session for a process

//之前parent和child运行在同一个session里,parent是会话(session)的领头进程,

//parent进程作为会话的领头进程,如果exit结束执行的话,那么子进程会成为孤儿进程,并被init收养。

//执行setsid()之后,child将重新获得一个新的会话(session)id。

//这时parent退出之后,将不会影响到child了。


二、umask 一般与 int open(const char *pathname, int flags, mode_t mode)合用

每个文件都有权限,每新创建一个文件就要指定文件权限(mode &umask)

新创建的文件pathname 的 文件权限 = (umask & mode)


#include <fcntl.h>
int main()
{
    int fd;
    umask(0026);
    fd = open("test.txt",O_RDWR | O_CREAT,0666);
    if(fd < 0)
        perror("open");
    return 0;
}

文件权限结果为 666 - 26 = 640 = rw-r-----


三、getdtablesize ()

            这个函数定义为__sysconf(open_max)形式,getdtablesize ()是返回所在进程的文件描述附表的项数,即该进程打开的文件数目


四、什么是linux的"重定向"???

        Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作。


实验步骤

守护进程编写的主要步骤如下:
        1) 将程序进入后台执行。由于守护进程最终脱离控制终端,到后台去运行。方法是在进程中调用 fork 使父进程终止,让 Daemon 在子进程中后台执行。这就是常说的“脱壳”。子进程继续函数 fork()的定义如
下:pid_t fork(void);
        2) 脱离控制终端、登录会话和进程组。开发人员如果要摆脱它们,不受它们的影响,一般使用 setsid() 设置新会话的领头进程,并与原来的登录会话和进程组脱离。
        3) 禁止进程重新打开控制终端。
        4) 重设文件权限掩码
        5) 关闭打开的文件描述符,并重定向标准输入、标准输出和标准错误输出的文件描述符。进程从创建它的父进程那里继承了打开的文件描述符。如果不关闭,将会浪费系统资源,引起无法预料的错误。关
闭三者的代码如下:for (fd = 0, fdtablesize = getdtablesize(); fd < fdtablesize; fd++) close(fd);
        6) 改变工作目录到根目录或特定目录进程活动时,其工作目录所在的文件系统不能卸下守护进程实例包括两部分:主程序 test.c 和初始化程序 init.c。主程序每隔一分钟向/tmp 目录中的日志test.log 报告运行状态。初始化程序中的 init_daemon 函数负责生成守护进程。读者可以利用 init_daemon函数生成自己的守护进程。


实验代码

init.c
#include < unistd.h >
#include < sys/types.h >
#include < sys/stat.h >
#include <stdlib.h>
void init_daemon(void)
{
int pid;
int i;
if (pid = fork()) { exit(0); } //是父进程,结束父进程
else if (pid < 0) { exit( -1 ); } //fork 失败,退出
setsid(); //第一子进程成为新的会话组长和进程组长
//并与控制终端分离
if (pid = fork()) { exit(0); } //是第一子进程,结束第一子进程
else if (pid < 0) { exit(1); } //fork 失败,退出
//第二子进程不再是会话组长
for(i=0; i< getdtablesize(); ++i) //关闭打开的文件描述符
close(i);
chdir("/tmp"); //改变工作目录到 /tmp
umask(0); //重设文件创建掩模
return;
}


测试程序test.c

#include <stdio.h>
#include <time.h>
void init_daemon(void);
//守护进程初始化函数
int main(){
FILE *fp;
time_t t;
init_daemon();
//初始化为 Daemon

while(1) //每隔 2 秒钟向 test.log 报告运行状态
{
sleep(2); //睡眠 2 秒钟
if((fp = fopen("test.log","a")) != NULL)
{
t=time(0);
fprintf(fp,"I'm here at %sn",asctime(localtime(&t)) );
fclose(fp);
}
}
return 0;
}

编译:
 [root@vm root]#gcc –g –o test init.c test.c
执行:
 [root@vm root]#./test
查看进程: [root@vm root]#ps –ef
从输出可以发现 test 守护进程的各种特性满足上面的要求。


本文转自lilin9105 51CTO博客,原文链接:http://blog.51cto.com/7071976/1418841,如需转载请自行联系原作者

相关文章
|
23天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
166 78
|
2天前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
43 20
|
26天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
57 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
22天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
91 13
|
29天前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
23天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
40 0
|
7月前
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
146 13
|
6月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
6月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
203 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
5月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。
下一篇
开通oss服务