linux 嵌入式 守护进程编写
- 格式:doc
- 大小:1.13 MB
- 文档页数:7
一、实验目的1. 理解守护进程的概念和作用。
2. 掌握创建守护进程的基本方法和步骤。
3. 学会使用守护进程实现后台服务的运行。
二、实验环境1. 操作系统:Linux2. 编程语言:C语言3. 开发环境:gcc编译器三、实验原理守护进程(Daemon)是一种在后台运行的服务程序,它不受用户登录和注销的影响,持续为系统提供各种服务。
守护进程通常具有以下特点:1. 无需用户干预,自动运行。
2. 在后台运行,不占用终端。
3. 不受用户登录和注销的影响。
创建守护进程的基本步骤如下:1. 创建一个普通进程。
2. 将该进程转换为守护进程。
3. 释放与终端的关联,使其成为独立进程。
四、实验内容1. 编写一个守护进程程序,实现简单的后台服务功能。
2. 使守护进程在后台持续运行,不受用户登录和注销的影响。
五、实验步骤1. 编写源代码```c#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>#include <signal.h>#define DAEMON_NAME "daemon"int main() {pid_t pid;int status;// 创建子进程pid = fork();if (pid < 0) {perror("fork");exit(1);}// 子进程成为守护进程if (pid > 0) {// 父进程退出exit(0);}// 将子进程转换为守护进程umask(0); // 设置文件权限掩码setsid(); // 创建新的会话,使子进程成为守护进程// 将子进程的工作目录切换到根目录chdir("/");// 关闭信号处理函数signal(SIGCHLD, SIG_IGN);// 创建守护进程名if (daemon(0, 0) < 0) {perror("daemon");exit(1);}// 守护进程主循环while (1) {printf("守护进程 %s 运行中...\n", DAEMON_NAME); sleep(10); // 等待10秒}return 0;}```2. 编译源代码```bashgcc -o daemon daemon.c```3. 运行守护进程```bash./daemon &```4. 查看守护进程状态```bashps -ef | grep daemon```六、实验结果与分析1. 编译并运行守护进程程序后,可以看到守护进程在后台持续运行,不受用户登录和注销的影响。
linux中守护进程的方法Linux中的守护进程方法在Linux系统中,守护进程(daemon)是一种在后台运行的进程,它独立于终端并且没有控制终端。
守护进程通常用于在系统引导时启动,并在系统运行期间一直运行,以提供某种服务或执行特定的任务。
本文将介绍Linux中守护进程的方法。
1. 使用nohup命令nohup命令用于在退出终端后继续运行进程。
通过在命令前添加nohup,可以将进程转变为守护进程。
例如:```nohup command &```其中,command是要运行的命令。
通过在命令的末尾添加&符号,可以将其放入后台运行。
2. 使用systemd服务systemd是Linux系统中的一个系统和服务管理器。
通过创建systemd服务单元文件,可以将进程设置为守护进程。
首先,在`/etc/systemd/system/`目录下创建一个以.service为后缀的文件,例如`mydaemon.service`。
然后,在文件中定义服务的相关信息,包括服务的名称、描述、启动命令等。
最后,使用systemctl命令来启动、停止或管理服务。
例如:```systemctl start mydaemon.service```3. 使用upstartupstart是一种Linux系统初始化和事件处理系统。
通过创建upstart配置文件,可以将进程设置为守护进程。
首先,在`/etc/init/`目录下创建一个以.conf为后缀的文件,例如`mydaemon.conf`。
然后,在文件中定义进程的相关信息,包括进程的启动条件、启动命令等。
最后,使用start、stop等命令来管理进程。
例如:```start mydaemon```4. 使用supervisorsupervisor是一个基于Python开发的进程管理工具。
通过创建supervisor配置文件,可以将进程设置为守护进程。
首先,在`/etc/supervisor/conf.d/`目录下创建一个以.conf为后缀的文件,例如`mydaemon.conf`。
Linux系统进程监控脚本使用Shell脚本监控系统进程并自动重启Shell脚本作为一种自动化脚本语言,可在Linux系统中编写和执行各种任务。
其中,一项重要的任务是监控系统进程并在必要时自动重启。
本文将介绍如何使用Shell脚本来实现Linux系统进程监控和自动重启的功能。
一、编写监控脚本首先,我们需要编写一个监控脚本来监控系统中的进程。
以下是一个示例的监控脚本:```#!/bin/bashprocess_name="example_process" # 要监控的进程名称while truedoprocess_num=$(pgrep $process_name | wc -l) # 统计进程数量if [ $process_num -eq 0 ]; then # 如果进程数量为0echo "进程 $process_name 未运行,正在尝试重新启动..."# 重新启动进程的命令,例如:# /path/to/example_process &# 注意加上后台运行符号&fisleep 60 # 休眠60秒,避免频繁检测done```在上述脚本中,首先定义了要监控的进程名称为`example_process`,然后使用一个无限循环来检测进程是否在运行。
通过`pgrep`命令和`wc -l`命令可以统计指定进程名称的进程数量。
如果进程数量为0,则输出提示信息,并执行重启进程的操作(根据实际情况自行修改重启命令)。
最后,使用`sleep`命令休眠60秒,以避免频繁检测。
二、保存并设置执行权限将上述脚本保存为一个以`.sh`为后缀的文件,例如`monitor_process.sh`。
然后,通过命令`chmod +x monitor_process.sh`为脚本文件添加执行权限。
三、设定定时任务为了让监控脚本能够定期执行,我们可以使用Linux系统中的定时任务功能。
嵌⼊式⾯试笔试题⽬——附部分答案1 、如何⾃动创建设备⽂件?class_create device_create2、led驱动编写有⼏种⽅式?输⼊⼦系统字符设备驱动总线platform led⼦系统3、如何实现http服务器?tcp服务器:socket4、如何编写守护进程,简述syslog的作⽤?第⼀步:创建进程、杀死⽗进程第⼆步:创建新的会话第三步:改变⼯作路径路径第四步:修改⽂件掩码权限第五步:关闭⽂件描述符5、bootloader和uboot的区别?bootloader是启动装载。
这是⼀段很⼩的程序,⽤于在系统上电启动初期运⾏,初始化关键接⼝,如内存,串⼝,关闭中断,关闭看门狗,引导系统进⼊内核的⼀段初始化的程序。
它主要任务就是将内核映像从硬盘读到RAM中,然后跳转到内核的⼊⼝点去运⾏内核,从⽽建⽴系统运⾏的必要环境。
uboot:是bootloader的⼀种6、如何移植uboot?1、下载源码2、解压uboot源码并进⼊⽬录3、指定交叉编译⼯具链4、指定产品BOARD 底板5、编译u-boot7、传感器驱动如何编写?8、BL0,BL1,BL2,BL3的作⽤?BL0 ⽂件是存放在 CPU 内部 IROM 中的⼀段固化代码,CPU 上点之后,⾸先去运⾏soc中的BL0,运⾏时会将 BL1 拷贝到 CPU 的 IRAM 中,然后执⾏BL1;BL1⽂件执⾏起来之后会先进⾏内存的初始化,之后将 BL2 ⽂件拷贝到外部内存中,BL2会初始化BL3的运⾏环境,将BL3搬移到DRAM中,BL3会有⼀个⾃搬移的过程,从⽽启动内核⼊⼝。
BL0:CPU内部的固化代码BL1:三星提供的加密⽂件BL2:截取uboot.bin 前14kBL3:剩下的uboot 执⾏命令以及加载引导内核9、exynos4412 时钟 APLL,MPLL,VPLL的区别?------倍频锁相环APLL:⽤于 CPU_BLK (可产⽣⾼达1.4GHz的频率);作为 MPLL 的补充,它也可以给DMC_BLK 、LEFTBUS_BLK 、RIGHTBUS_BLK 和 CMU_TOP 提供时钟。
嵌入式操作系统Linux实验报告专业:计算机科学与技术班级:13419011学号:1341901124姓名:武易组员:朱清宇实验一Linux下进程的创建一实验目的1.掌握Linux下进程的创建及退出操作2.了解fork、execl、wait、waitpid及之间的关系二实验内容创建进程,利用fork函数创建子进程,使其调用execl函数,退出进程后调用wait或waitpid清理进程。
三实验过程1.进程的创建许多进程可以并发的运行同一程序,这些进程共享内存中程序正文的单一副本,但每个进程有自己的单独的数据和堆栈区。
一个进程可以在任何时刻可以执行新的程序,并且在它的生命周期中可以运行几个程序;又如,只要用户输入一条命令,shell进程就创建一个新进程。
fork函数用于在进程中创建一个新进程,新进程是子进程。
原型如下:#include<sys/types.h> /* 提供类型pid_t的定义 */#include<unistd.h> /* 提供函数的定义 */pid_t fork(void);使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间fork系统调用为父子进程返回不同的值,fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:在父进程中,fork返回新创建子进程的进程ID;✓在子进程中,fork返回0;✓如果出现错误,fork返回一个负值;用fork创建子进程后执行的是和父进程相同的程序,子进程可以通过调用exec函数以执行另一个程序。
当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程(例如其m a i n函数)开始执行。
调用e x e c并不创建新进程,进程I D并未改变,只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。
e x e c函数原型execl,execlp,execle,execv,execve和execvp2.进程的退出一个进程正常终止有三种方式:由main()函数返回;调用exit()函数;调用_exit()或_Exit()函数。
linux启动守护进程的方法在Linux系统中,守护进程(daemon)是一种在后台运行的进程,它不依赖于用户终端,并且在系统启动时自动启动。
守护进程通常用于执行一些系统级任务,如网络服务、定时任务等。
本文将介绍在Linux系统中启动守护进程的方法。
1. 使用init.d脚本在早期的Linux系统中,使用init.d脚本是启动守护进程的常见方式。
这些脚本位于/etc/init.d目录下,以及/etc/rc.d/init.d目录下,不同的发行版可能会有所不同。
通过编写一个init.d脚本,可以定义守护进程的启动、停止、重启等操作。
init.d脚本一般包括以下几个步骤:- 设置脚本的执行权限:chmod +x /etc/init.d/your_daemon- 定义启动、停止、重启等操作函数:start()、stop()、restart()等- 定义启动优先级:通过在脚本中添加注释指定启动顺序,如# chkconfig: 2345 80 20- 将脚本链接到相应的运行级别目录中:ln -s /etc/init.d/your_daemon /etc/rc.d/rcX.d/S80your_daemon2. 使用systemd单元文件在较新的Linux系统中,systemd已经取代了传统的init进程作为系统的init系统。
systemd使用单元文件(unit file)来管理系统服务,通过编写一个单元文件,可以定义守护进程的启动方式、依赖关系等信息。
一个简单的systemd单元文件示例如下:```[Unit]Description=Your DaemonAfter=network.target[Service]ExecStart=/path/to/your_daemonType=simpleRestart=alwaysUser=your_user[Install]WantedBy=default.target```将上述内容保存为your_daemon.service,并将其放置在/etc/systemd/system目录下。
linux守护进程课程设计一、教学目标本课程的学习目标包括知识目标、技能目标和情感态度价值观目标。
知识目标要求学生掌握Linux守护进程的基本概念、创建方法以及常用系统调用。
技能目标要求学生能够独立编写脚本创建守护进程,并了解守护进程在实际应用中的配置和管理。
情感态度价值观目标则是培养学生对Linux系统的兴趣和好奇心,提高他们对开源技术的认同感和责任感。
通过本课程的学习,学生将能够理解Linux系统中守护进程的作用和重要性,熟练掌握守护进程的创建和管理方法,为后续的Linux系统编程和运维工作打下坚实基础。
二、教学内容本课程的教学内容主要包括Linux守护进程的基本概念、创建方法、常用系统调用以及守护进程的配置和管理。
1.Linux守护进程的基本概念:介绍守护进程的定义、特点和作用,以及守护进程与普通进程的区别。
2.守护进程的创建方法:讲解如何在Linux系统中创建守护进程,包括使用fork()、setsid()和fork()/setsid()组合等方法。
3.常用系统调用:介绍守护进程在运行过程中常用的系统调用,如write()、read()、open()等,以及如何在守护进程中使用这些系统调用。
4.守护进程的配置和管理:讲解如何配置和管理Linux系统中的守护进程,包括查看守护进程状态、设置守护进程优先级、守护进程的日志输出等。
三、教学方法本课程将采用讲授法、讨论法、案例分析法和实验法等多种教学方法。
1.讲授法:通过讲解Linux守护进程的基本概念、创建方法、常用系统调用和配置管理等内容,使学生掌握守护进程的相关知识。
2.讨论法:学生就守护进程的实际应用场景、遇到的问题和解决方案进行讨论,提高学生的思考和分析能力。
3.案例分析法:通过分析典型的Linux守护进程案例,使学生更好地理解守护进程在实际应用中的作用和配置方法。
4.实验法:安排学生动手实践,编写脚本创建守护进程,并配置和管理Linux系统中的守护进程,提高学生的实际操作能力。
linux系统编程试卷(答案)凌阳教育嵌入式培训系统编程部分测试试题注:考试为闭卷,程序题需上机操作运行出结果,考试时间为120分钟一:选择题(本题共4小题,每题3分共12分)1)下列不是Linux系统进程类型的是( D )A 交互进程B 批处理进程C 守护进程D 就绪进程(进程状态)2)以下对信号的理解不正确的是( B )A 信号是一种异步通信方式B 信号只用在用户空间进程通信,不能和内核空间交互C 信号是可以被屏蔽的D 信号是通过软中断实现的3)进程有三种状态( C )A 准备态、执行态和退出态B 精确态、模糊态和随机态C 运行态、就绪态和等待态D 手工态、自动态和自由态4)不是进程和程序的区别( B)A 程序是一组有序的静态指令,进程是一次程序的执行过程B 程序只能在前台运行,而进程可以在前台或后台运行C 程序可以长期保存,进程是暂时的D 程序没有状态,而进程是有状态的二:填空题(本题共6小题,2)、3)两题每空四分,其余每空一分。
共23分)1) 列举八种常见的进程间通信方式无名管道、有名管道、消息队列、信号量、共享内存、信号、套接字网络上两个主机的进程间通信方式为套接字2) 命名管道比无名管道的优势提供了一个可以访问的路径名,实现没亲缘关系的进程间通信3) 消息队列比命名管道和无名管道的优势可以按类型实现消息的随机查询,没必要先进先出4) 按照逻辑结构不同进行数据库划分,Sqlite 数据库属于哪一类关系型数据库5) 在C语言中操作sqlite数据库,常用的2中方式是sqlite_exec(回调)、sqlite_gettable(非回调)6) 列举四种进程调度算法先来先调度(FCFS)、短进程优先调度(SPF)、高优先级调度(HPF)、时间片轮转调度三:问答题(本题共7题,每题5分,共35分)1) 什么是系统调用?系统调用是通过什么方式陷入内核态的?请写出你对系统调用的理解。
什么是文件I/O和标准I/O库?文件I/O和标准I/O库的区别?系统调用是指操作系统提供给用户程序调用的一组特殊接口,用户程序可以通过这组接口获得操作系统内核提供的服务。
成绩:
《嵌入式Linux应用程序开发》
作业与上机实验
(三)
班级: 12级电实班
学号: ***********
*名:**
任课老师:张舸
完成时间: 2014/10/26
信息与通信工程学院
2014—2015学年第1 学期
实验三守护进程编写
一、实验目的
1.熟悉Linux系统中守护进程的基本概念。
2.掌握Linux系统中守护进程编写方法。
二、实验内容
1.建立一个守护进程,然后在该守护进程中新建一个子进程,该子进程暂停10s,然后自动退出,并由守护进程收集子进程退出的消息。
子进程退出后,守护进程循环暂停,其间隔时间为10s。
2.要求子进程和守护进程的退出消息均在/var/log/messages中输出。
3.画出流程图,通过编程实现。
4.在实验平台上运行,记录实验过程与实验现象,并进行简单分析。
三、实验参考
1.守护进程创建流程图
2.参考源代码
/*proc_daemon.c*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <syslog.h>
#define MAXFILE 65535
int main(void)
{
pid_t child1,child2;
int i;
child1 = fork()
if( child1 == -1 ) ///创建守护进程
{
perror("child1 fork"); ///错误处理
exit(1);
}
else if( child1 > 0 )
exit( 0 );
openlog("exc2_info", LOG_PID, LOG_DAEMON);
setsid(); ///在子进程中创建新的会话
chdir( "/" ); ///改变当前目录为根目录
umask( 0 ); ///重设文件权限掩码
for( i = 0 ; i < MAXFILE ; i++ )
{
close( i );
}
child2 = fork(); ///在该守护进程中新建一个子进程if( child2 == -1 )
{
perror("child2 fork");
exit(1);
}
else if( child2 == 0 )
{
syslog( LOG_INFO, " child2 will sleep for 10s ");///子进程暂停10s
sleep(10);
syslog( LOG_INFO, " child2 is going to exit! ");///子进程自动退出
exit(0);
}
else
{
waitpid( child2, NULL, 0);///守护进程收集子进程退出的消息
syslog( LOG_INFO , " child1 noticed that child2 has exited " );
closelog();
while(1)
{
sleep(10);///子进程退出后,守护进程循环暂停,其间隔时间为10s }
}
}
四、实验步骤
(1)、改变路径
$ cd /home/mich/shiyan/
(2)、新建文件shouhu.c,使用vi编辑器进行编辑,写入代码。
$vi shouhu.c
(3)、使用gcc编译器对源代码shouhu.c进行编译,指定生成的目标文件名为shouhu,输入命令如下。
$ gcc shouhu.c -o shouhu
如终端提示错误信息,则应返回2.1仔细检查和修改源代码,直到编译产生目标文件shouhu为止,记录源代码错误部分的修改内容,并分析原因。
(4)、查看目标文件shouhu属性,输入命令如下。
$ ls -l
(5)、如shouhu无可执行权限,则需添加可执行权限,输入命令如下。
$ chmod a+x shouhu
(6)、执行shouhu,输入命令如下。
$ ./shouhu
如运行结果未达到图一所示,则返回2.1按顺序重复进行源代码编辑和编译操作,直到运行结果达到预计要求为止,记录具体修改过程和实验运行结果。
(7)、源代码交叉编译
使用交叉编译工具链arm-linux-gcc对源代码shouhu.c进行编译,指定生
成的可以在实验平台上运行的目标文件名为shouhu_a,输入命令如下。
$ arm-linux-gcc shouhu.c -o shouhu_a
(8)、复制shouhu_a到FTP服务器vsftpd的默认路径,输入命令如下。
$ cp shouhu_a /home/ftp
(9)、配置Ubuntu的IP地址与实验平台为同一网段。
实验平台固化IP地址为192.168.10.145,为便于以下的说明,假设实验者配置Ubuntu的IP地址为192.168.10.100。
(10)、由于实验平台上仅有/var为可读写路径,因此首先必须切换工作路径至/var,输入命令如下。
# cd /var
(11)、利用网络将交叉编译生成的目标文件shouhu_a下载至实验平台, 输入以下命令登录FTP服务器。
#ftp 192.168.10.100
进入FTP服务器后按照提示,输入用户名ftp,密码ftp。
(12)、下载shouhu_a到本地,输入FTP内部命令如下。
> get shouhu_a /var/shouhu_a
(13)、待文件传输完成后断开FTP连接,输入FTP内部命令如下。
> quit
(14)、查看目标文件shouhu_a属性,输入命令如下。
# ls -l
检查实验平台的/var/shouhu_a与Ubuntu的/home/ftp/teat_a文件大小是否一致,如不一致,则需重新登录FTP服务器进行下载。
(15)、如shouhu_a无可执行权限,则需添加可执行权限,输入命令如下。
# chmod a+x shouhu_a
(16)、执行shouhu,输入命令如下。
# ./shouhu_a
(17)、启动syslogd的守护进程,通过syslog记录事件,输入命令如下。
# syslog
(18)、再次执行shouhu,输入命令如下。
# ./shouhu_a
(19)、改变路径
# cd /var/log
(19)、查看系统日志文件
# vi messages
如果在实验平台的显示器上显示如图一所以结果,则实验成功;
图一正确记录
五、思考题
1.说明创建一个守护进程的基本过程。
答:(1).创建子进程,父进程退出
(2).在子进程中创建新的会话
调用setsid()函数,作用有三个,让进程摆脱原会话的控制;让进程摆脱原进程组的控制;让进程摆脱原控制终端的控制,这里需要介绍进程组和会话组的概念;
进程组:是一个或多个进程的集合,由进程组ID来唯一标识,进程组组长的进程号等于该进程组的ID,且组长进程的退出不会影响该ID。
会话组:由一个或多个进程组构成,一个会话开始于用户登录,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话。
虽然经过第一步,但是子进程完全拷贝父进程的东西,导致,原先的会话期,进程组,控制终端没有变化,因此,还不算真正的脱离开来,而setsid()函数可以让进程完全独立开来。
(3).改变当前目录为根目录
使用fork创建的子进程继承了父进程的工作目录,导致当前工作目录不能卸载,可能造成一些麻烦通常都是让根目录为守护进程的当前目录,用函数chdir();
(4).重设文件权限掩码
文件权限掩码指屏蔽掉文件权限中的对应位,比如一个文件的权限掩码是050,就屏蔽了文件组拥有者的可读和可执行权限,子进程继承了父进程的一切东西,当然也包括权限掩码,导致子进程是用文件有诸多麻烦,因此把文件权限掩码设置为零,就可以增加该守护进程的灵活性。
(5).关闭文件描述符
同权限掩码一样,子进程继承了父进程的一些打开的文件,这些文件可能子进程永远也用不到,但是它们一样消耗系统资源,而且导致所在的文件系统无法卸载。
2.说明setsid函数的作用。
进程从它的双亲进程获得它的对话过程和进程组识别号。
setsid()就是将进程和它当前的对话过程和进程组分离开,并且把它设置成一个新的对话过程的领头进程。
3.列举出守护进程编写过程中使用syslog服务的注意事项。
答:syslog是Linux中的系统日志管理服务,通过守护进程syslogd来维护。
使用时,要先在运行程序之前需要在输入命令“syslog”开启向日志文件中写入消息的服务,不然日志文件中就没有进程的具体消息,上次我做实验时第一次没有输入该命令,结果在指定目录下就没有日志文件。