Linux复习 程序 注释
- 格式:doc
- 大小:137.50 KB
- 文档页数:9
linux思维导图期末知识点总结环境:虚拟机/云服务器许多程序需要开机启动,它们在win叫服务,在linux叫守护进程,init进去运行开机启动的程序。
正常情况下,很少遇到关机情况。
正确关机流程:sync > shutdown > reboot > halt区别于重启系统和关闭系统,都要运行sync,把内存中的数据写到磁盘中关机命令:shutdown –h now halt poweroff 和 init 0重启系统的命令:shutdown –r now reboot init 6内核版本cat /etc/issue系统版本cat /proc/version1、yum源进行备份进入到yum源的配置文件中执行命令如下:cd /etc/yum.repos.d将yum源进行备份:mv Centos-Base.repo Centos-Base.repo.bak2、获取阿里的yum源配置文件执行命令:wget -O Centos-Base.repo3、对yum源生成缓存执行命令:yum makecache4、更新yum源执行命令:yum -y install update执行完成之后就可以使用yum源了,到此yum源就更换成功了。
在 Linux 或 Unix 操作系统中,所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构。
文件系统的最顶层是由根目录开始的,系统使用 / 来表示根目录。
在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含子目录文件。
如此反复就可以构成一个庞大的文件系统。
/boot:存放的启动Linux 时使用的内核文件,包括连接文件以及镜像文件。
/etc:存放所有的系统需要的配置文件和子目录列表,更改目录下的文件可能会导致系统不能启动。
/lib:存放基本代码库(比如c++库),其作用类似于Windows里的DLL文件。
几乎所有的应用程序都需要用到这些共享库。
linux shell多行注释Linux shell是一种非常强大的命令行解释器,它可以用来运行各种各样的命令和脚本。
在很多情况下,我们需要在shell脚本中添加注释,以便在以后查看和修改代码时更易于理解。
本文将介绍如何在Linux shell中添加多行注释。
1. 井号(#)注释法在Linux shell中,添加注释最常用的方法就是使用井号(#)符号。
井号后面的所有字符都会被忽略。
例如,在下面的脚本中,我们使用井号注释了一些内容:``` #!/bin/bash# This is a shell script # It prints out the current timeecho "The current time is $(date)" ```这个脚本会输出当前的时间。
注意到这里使用了两个井号符号来注释,每一个井号后面的内容都被当做注释。
2. Here文档注释法在一些情况下,我们可能需要在脚本中添加比较长的注释,这时使用多行注释会更加方便。
Linux shell中可以使用here文档来实现多行注释。
Here文档是指一个带有特定结束标记的文本块。
在Linux shell中,可以使用这种文本块来表示多行注释。
例如,在下面的脚本中,我们使用here文档来添加注释:``` #!/bin/bash: <<'END_COMMENT' This is a shell script It prints out the current time END_COMMENTecho "The current time is $(date)" ```在这个脚本中,我们使用了: <<'END_COMMENT'来开始一个here文档,并且在END_COMMENT之前的所有内容都被当做注释。
这样,我们就可以在脚本中添加多行注释了。
linux shell多行注释Linux Shell 多行注释在Linux操作系统中,Shell是一种命令行解释器,用于解释和执行用户输入的命令。
Shell脚本是一种简单而强大的编程语言,可以用于自动化任务、批处理操作和系统管理。
在Shell脚本中,注释是一种用于解释代码目的和功能的文本。
本文将介绍Linux Shell中多行注释的用法和示例。
多行注释是一种在脚本中添加多行文本注释的方法。
它在Shell脚本中起到注释代码、解释功能、提供文档说明的作用。
多行注释可以帮助他人理解代码的逻辑和用途,也可以帮助自己回顾代码的目的和设计。
在Shell脚本中,多行注释通常使用以下格式标识::<<EOF这里是注释内容可以写多行注释EOF上述注释格式中,冒号(:)表示一个无意义的命令,<<EOF表示输入重定向,EOF是一个标记,用于标识注释的结束。
在EOF标记之间的内容都会被解释器忽略,不会被执行。
下面是一个使用多行注释的示例::<<COMMENT这是一个示例的Shell脚本用于统计指定目录下的文件数量和目录数量COMMENT# 统计文件数量file_count=$(ls -l | grep "^-" | wc -l)echo "文件数量:$file_count"# 统计目录数量dir_count=$(ls -l | grep "^d" | wc -l)echo "目录数量:$dir_count"在上述示例中,通过使用多行注释,我们可以清晰地解释脚本的功能和用途。
在注释之后,我们使用了两个命令来统计指定目录下的文件数量和目录数量,并将结果输出到屏幕上。
多行注释还可以用于暂时禁用一段代码。
例如,当我们需要调试脚本时,可以将一段代码用多行注释注释掉,以便在调试完成后再恢复代码的执行。
下面是一个使用多行注释暂时禁用代码的示例:# 这是一段需要禁用的代码:<<DISABLED_CODEecho "这段代码被禁用了"echo "这段代码也被禁用了"DISABLED_CODEecho "这段代码没有被禁用"在上述示例中,我们使用多行注释将一段代码注释掉,注释的代码不会被执行。
第1章编译与调试一个程序的编译,需要完成词法分析、语法分析、中间代码生成、代码优化、目标代码生成。
gcc是Linux下的C程序编译器。
gcc在编译一个程序时,一般需要完成预处理、编译、汇编和链接过程。
编写一个C程序:Init 3进入文本界面(init5进入图形界面)lgin:root password:123456在根目录下创建一个文件夹:mkdir a查看该文件夹下子目录:ls创建a.c文件:vi a.c按“i”键,进入到插入模式代码输入完成后,按“Esc”键,返回到普通模式,然后输入:wq,保存文件并退出用gcc编译程序:gcc –o a.o a.c这时在终端输入“ls”命令会出现一个a.o可以对这个程序添加可执行权限:chmod +x a.o运行这个程序:./a.o查看gcc参数:gcc --help查看程序的编译过程和显示已经调用的库:gcc -v a.c 如果源代码的文件扩展名不是默认的扩展名可以用:gcc -x …c‟ a.u编译C++程序时,使用的命令是g++控制预处理过程参数-E可以完成程序的预处理工作而不进行其他的编译工作。
将a.c进行预处理,然后保存a.cxx中:gcc -E -o a.cxx a.c输入vi a.xxx查看预处理以后的a.cxx文件生成汇编代码参数-S可以控制gcc在编译C程序时只生成相应的汇编程序文件,而不继续执行后面的编译,将a.c编译成一个汇编程序:gcc -S -o a.s a.c生成目标代码参数-c可以使得gcc在编译程序时只生成目录代码而不生成可执行程序,将a.c编译成目录代码:gcc -c -o a.o a.c链接成成可执行文件gcc可以把上一步骤生成的目录代码文件成成一个可执行文件:gcc a.o -o aa.out这时生成一个可执行文件aa.out。
输入下面的命令查看这个文件的信息。
file aa.outgdb调试程序使用这个工具进行程序调试时,主要使用gdb进行下面5个方面的操作。
选择:1、若当前目录为/home,命令ls–l将显示home目录下的(文件的具体信)。
2、如何快速切换到用户John的主目录下?(cd~John)3、启动DNS服务的守护进程(named start)4、.RED HAT LINUX9默认使用的文件系统类型为(ext3)5、.在LINUX中,要查看文件内容,可使用(more)命令6、光盘所使用的文件系统类型为(ISO9660)。
7、.LINUX所有服务的启动脚本都存放在(/etc/rc.d/init.d)目录中。
8、若要使用进程名来结束进程,应使用(kill)命令。
9、RED HAT LINUX所提供的安装软件包,默认的打包格式为(rpm)。
10.若要将当前目录中的myfile.txt文件压缩成myfile.txt.tar.gz,则实现的命令为(tar–zcvfmyfile.txt.tar.gz myfile.tx)11、LINUX交换分区的格式为(swap)。
12、.LINUX用于启动系统所需加载的内核程序位于(/boot)13、在LINUX运行的7个级别中,X—WINDOWS图形系统的运行级别为(5)。
14、若在文字界面下,需要键入何种指令才能进入图形界面(Xwindow)。
(startx)15、一个bash shell脚本的第一行是(.#!/bin/bash)16、.改变文件所有者的命令为(chown)17、在给定文件中查找与设定条件相符字符串的命令为(grep)。
18、存放Linux基本命令的目录是什么(/bin)19、.在shell编程时,使用方括号表示测试条件的规则是:方括号两边必有(空格)。
20、在Linux系统下,第二个IDE通道的硬盘(从盘)被标识为(hdb)。
21、在Linux操作系统中,设备都是通过特殊的(文件)来访问。
22、shell不仅是(用户命令的解释权),它同时也是一种功能强大的编程语言。
填空:1、三种软件模式:商业软件(Commercial Software)、共享软件(Shareware)、自由软件(Freeware或Free Software)2、LINUX的组成:LINUX的内核、LINUX SHELL、LINUX文件系统、LINUX应用系统3、查看文件内容的分页命令包括:less和more4、 Writer的功能和microsoft office的word功能相似, Calc的功能和microsoft office的excel功能相似, Impress和microsoft office的powerpoint功能相似5、Linux中的各种shell,写出其中五种:bash、bsh、csh、ksh、tcsh、zsh、ash6、在某个目录提示符下运行ls,会显示该目录下的内容,其中内容为红色,目录为蓝色,文件为黑色。
第一章1.Linux是多用户、多任务操作系统。
2.程序是计算机完成一项任务的指令集合。
3.数据是由程序使用或生成的不同类型的信息。
4.软件分为三大类:(1)系统软件(2)应用软件(3)支撑软件5.系统软件包括操作系统、编译程序、汇编程序、数据库管理系统、网络软件等。
系统软件对计算机系统的资源进行控制、管理,并为用户的应用和其他程序的运行提供服务。
6.支撑软件包括编辑程序、查错程序、项目管理程序等。
辅助软件技术人员从事软件开发和项目管理人员进行项目管理工作的软件。
7.应用软件是为解决某一类应用需要或某个特定问题而设计的程序。
8.Linux提供4种不同的用户接口:(1)命令行接口(2)菜单(3)图形用户接口(4)程序接口9.命令解释程序称为shell。
10.程序接口也称为系统调用接口。
系统调用时操作系统内核与用户程序、应用程序之间的接口。
11.内核之外的程序都必须经由系统调用才能获得操作系统的服务。
系统调用只能在C程序中使用,不能作为命令在终端上执行。
由于系统调用能直接进入内核执行,所以执行效率很高。
12.Linux解决资源使用过程中的冲突,保证资源最后能被系统再次使用所采取的方法:(1)通过记录和文件加锁,保证数据的完整性(2)利用调度进程和审计系统(3)当系统出现错误时,提供错误诊断信息(4)终止运行不正常的进程,甚至在最坏的情况下停止系统13.软件以是否以营利为目的分为三种模式:(1)商业软件(2)共享软件(3)自由软件14.Linux用户分为:(1)个人用户(2)专业用户(3)商业用户15.Linux的特点:(1)与unix系统兼容(2)自由软件和源码公开(3)性能高和安全性强(4)便于定制和再开发(5)互操作性高(6)全面的多任务和真正的32位操作系统16.Linux的两种版本:(1)核心版本(2)发行版本17.核心版本的序号:major.minor.patchlevelmajor主版本号minor次版本号共同构成核心版本号。
linux期末知识点总结一、Linux的概述1.1 Linux的起源和发展历史Linux是一种自由和开放源代码的类Unix操作系统。
Linux的起源可以追溯到1991年,由芬兰计算机科学家Linus Torvalds在赫尔辛基大学开始开发。
随着开源社区的支持和参与,Linux在逐渐成为世界上使用最广泛的操作系统之一。
1.2 Linux的特点Linux具有开放源代码、兼容性强、系统功能强大、安全性高、稳定性好等特点。
与Windows等闭源系统相比,Linux能够自由访问和修改源代码,因此具有更高的灵活性和可定制性。
1.3 Linux的应用领域Linux主要应用于服务器、嵌入式设备、超级计算机、移动设备等领域。
随着开源软件的发展和普及,Linux也在桌面操作系统领域逐渐崭露头角。
二、Linux的基本概念2.1 内核和ShellLinux操作系统的核心是内核,它负责管理硬件、文件系统、网络和进程等系统资源。
Shell是用户与内核进行交互的接口,用户可以通过Shell来执行命令、管理文件和进程等。
2.2 文件系统和目录结构Linux使用一种层次化的文件系统结构,以根目录“/”为起点,所有文件和目录都从根目录开始组织。
Linux的文件系统使用树状结构,用户可以通过目录来管理文件,以提高文件的组织和管理效率。
2.3 用户和权限Linux系统中的用户分为普通用户和超级用户(root)两种,普通用户只能访问自己的文件和目录,而超级用户对系统的所有资源都有完全访问权限。
Linux还使用权限控制来管理文件和目录的访问权限,分为读、写和执行三种权限。
2.4 进程管理Linux系统中的进程是指正在运行的程序的实例,通过进程管理可以查看和管理系统中正在运行和等待运行的进程。
用户可以使用命令来创建、终止和调度进程,以实现任务的管理和协调。
2.5 网络和通信Linux系统支持网络通信和数据传输,用户可以通过网络连接来实现远程操作和数据传输。
linux考试知识点总结Linux操作系统是一种开源的操作系统,广泛应用于服务器、嵌入式设备和智能手机等领域。
由于其稳定性、安全性和灵活性,越来越多的企业和个人选择使用Linux系统。
而对于一名Linux系统管理员或者开发人员来说,掌握Linux系统的相关知识是非常重要的。
为了帮助大家更好地备战Linux考试,本文将对Linux考试的知识点进行总结和整理。
一、Linux基础知识1. Linux概述Linux是一种开源的类Unix操作系统,最初由芬兰计算机科学家Linus Torvalds在1991年创建。
Linux操作系统基于Unix操作系统,其内核是由C语言编写的,并被授权为GNU通用公共许可证下的自由软件。
Linux系统具有很高的稳定性、安全性和灵活性,广泛应用于服务器、嵌入式设备和智能手机等领域。
Linux系统的发展离不开全球开源社区的贡献,目前已经发展成为一个庞大、强大的操作系统。
2. Linux文件系统Linux文件系统是Linux系统中用于管理文件和目录的一种系统。
Linux文件系统有多种不同的类型,其中包括ext3、ext4、XFS、btrfs等。
每种文件系统都有各自的特性和适用场景,可以根据实际情况在不同的文件系统之间进行选择。
3. Linux命令行操作在Linux系统中,命令行操作是非常重要的一部分。
通过命令行操作,可以方便地对系统进行管理和操作。
常用的Linux命令包括ls、cd、pwd、cp、mv、rm、mkdir、rmdir、touch、cat、more、less、head、tail、chown、chmod、grep等等。
4. 用户和用户组管理在Linux系统中,用户和用户组是非常重要的概念。
每个用户都有自己的用户名和密码,同时还可以属于一个或多个用户组。
通过用户和用户组管理,可以对系统资源进行灵活的分配和管理。
5. 文件和目录权限管理在Linux系统中,每个文件和目录都有自己的权限。
Linux操作系统部分复习题答案第⼀章 Linux系统简介⼀、思考题1.UNIX的⼤部分代码是⽤⼀种流⾏的程序设计语⾔编写的,该语⾔是什么?C语⾔2.UNIX系统的特点有哪些?·多任务·多⽤户·并⾏处理能⼒·设备⽆关性·⼯具·错误处理·强⼤的⽹络功能·开放性3.什么是Linux?其创始⼈是谁?Linux是⼀个功能强⼤的操作系统,同时它也是⼀个⾃由软件,是免费的、源代码开放的、可以⾃由使⽤的UNIX兼容产品。
其创始⼈是Linus4.Linux操作系统的诞⽣、发展和成长过程始终依赖者的重要⽀柱都有哪些?·UNIX操作系统·MINIX操作系统·GNU计划·POSIX标准·Internet5.简述Linux系统的特点。
·⾃由软件·良好的兼容性·多⽤户、多任务·良好的界⾯·丰富的⽹络功能·可靠地安全性、稳定性·⽀持多种平台6.常见的Linux的发⾏版本有哪些?·Red Hat Linux·Caldera OpenLinux·SuSE Linux·TurboLinux·红旗Linux·中软Linux⼆、选择题1.Linux最初是以MINIX 操作系统为模板⽽开发出来的。
2.关于Linux内核版本的说法,下列选项中错误的是(C)。
A.表⽰为主版本号.次版本号.修正号B.1.2.3表⽰稳定的发⾏版C.1.3.3表⽰稳定的发⾏版D.2.2.5表⽰对内核2.2的第5次修正(补充:次版本号为偶数的是稳定版本;为奇数的则是测试版本。
)3.Linux属于⾃由软件。
4.⾃由软件的含义是软件可以⾃由修改和发布。
5.⼀下不具有多任务性的操作系统是DOS第⼆章 Linux系统⼊门⼀、思考题1.Linux系统有哪些运⾏级别?其含义是什么?可⽤级别为0~6,其中0:关闭系统;6:重新启动,其他略。
单选题1.Linux文件权限一共10位长度,分成四段,第三段表示的内容是___C_____。
A 文件类型B 文件所有者的权限C 文件所有者所在组的权限D 其他用户的权限2.有关GPL的描述错误的是___D______。
a) GPL 和软件是否免费无关b) GPL 主要是保证软件对所有用户来说是自由的c) GPL 中文意思是通用公共许可证d) GPL 是Linus Torvalds 在开发Linux时提出的3.hdb表示:_____D_____A 第二个IDE硬盘B 第二个逻辑盘C 第一个IDE硬盘的第二个分区D 第二个主分区4./lost+found目录的功能是_____C______A 存放系统启动时候存放内存映象B 存放临时文件C 系统故障时,存放那些“无家可归”的文件D 存放系统配置文件5.Bourne Shell的程序名为:___A_____A. bashB. zshC. rcD. sh6.安装Linux系统必不可少的两个分区是:___A_____A /和swapB /boot和/C swap和/bootD /和home7.红旗Desktop 5.0系统使用了_D____版本的内核。
A 2.2B 2.3C 2.4D 2.68.Linux系统中网络配置文件一般存放在__A___目录?A /etcB /rootC /usrD /boot9.设置从光盘引导需要改变:___B_____A. Linux设置B. BIOS设置C. 跳线D. 重新分区10.搜索/目录下所有大于1M的文件,下列正确的是___D_____A find -size +1000k /B find / -size +1000C find -size / +1000kD find / -size +1000k11.内核不包括的子系统是____D____ 。
A 进程管理系统B 内存管理系统C I/O管理系统D硬件管理系统12.到达个人主目录的命令是:____B______A cd ..B cd ~C cdD cd.13.Linux当前目录用_A____表示。
前面的可能考选择题,填空题,全部题型如下:一、选择题(10个题,每题2分,共20分)二、填空题(10个空,每空2分,共20分)三、程序阅读题(2道题,共20分)四、未知题型(1道题,共20分)五、编程题(1道题,共20分)P 154 文件I/O操作open()、read()、write()、lseek()和close()仔细阅读程序,能写注释或填空。
/* copy_file.c */#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#include <stdio.h>#define BUFFER_SIZE 1024/* 每次读写缓存大小1KB,关于《linux读写文件运行效率》的传送门*/#define SRC_FILE_NAME "src_file" /* 源文件名,之后用SRC_FILE_NAME代替src_file */#define DEST_FILE_NAME "dest_file" /* 目标文件名文件名,之后用DEST_FILE_NAME代替dest_file */ #define OFFSET 10240/* 复制的数据大小 1MB,也是lseek函数的偏移量*/int main(){int src_file, dest_file; //定义了2个变量unsigned char buff[BUFFER_SIZE]; //设定缓存的大小,定义为数组,存放读写缓存int real_read_len;/* 以只读方式打开源文件 */src_file = open(SRC_FILE_NAME, O_RDONLY); //前面的src_file是变量名,成功时为3,失败时为-1 //也可以写成src_file = open("src_file", O_RDONLY);/* 以只写方式打开目标文件,若此文件不存在则创建该文件, 访问权限值为644 */dest_file = open(DEST_FILE_NAME, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);//前面的dest_file是变量名,成功时为4,失败时为-1//也可以写成 d est_file = open("dest_file",O_WRONLY|O_CREAT,644);if (src_file < 0 || dest_file < 0) //打开文件失败时{printf("Open file error\n"); //输出这句话exit(1); // exit()中,1是返回给操作系统的,0是正常退出}/* 将源文件的读写指针移到最后10KB的起始位置*/lseek(src_file, -OFFSET, SEEK_END); //从文件的结尾处向前移动10KB// OFFSET 是偏移量,正值向前移,负值向后移。
这里在 OFFSET 前加了负号。
// SEEK_END 表示从文件的结尾开始。
//也可以写成lseek("src_file", -10240, SEEK_END);/* 读取源文件的最后10KB数据并写到目标文件中,每次读写1KB */while ((real_read_len = read(src_file, buff, sizeof(buff))) > 0)//读取成功时返回读到的字节数//红字部分也可以写成 read("src_file", buff, 1024){write(dest_file, buff, real_read_len);// real_read_len 在上一步被赋值为 1KB,即real_read_len = 1024;//也可以写成write("src_file", buff, 1024)close(dest_file); //关闭文件,这里等同于close(4);close(src_file); //关闭文件,这里等同于close(3);return 0; //main函数里,return 0 就是关闭程序。
子程序里 return 为返回值。
}P 214 子进程和父进程wait()和waitpid() 仔细阅读程序,能写注释或填空,写出输出结果。
wait()函数是用于使父进程阻塞,直到一个子进程结束或者该进程接到了一个指定的信号为止。
如果该父进程没有子进程或者他的子进程已经结束,则wait()就会立即返回。
本例中首先使用fork()创建一个子进程,然后让其子进程暂停5s(使用了sleep()函数)。
接下来对原有的父进程使用waitpid()函数,并使用参数WNOHANG 使该父进程不会阻塞。
若有子进程退出,则waitpid()返回子进程号;若没有子进程退出,则waitpid()返回0,并且父进程每隔一秒循环判断一次。
该程序源代码如下所示:/* waitpid.c */#include <sys/types.h>#include <sys/wait.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>int main(){pid_t pc, pr;pc = fork(); //使用fork()函数,创建了一个子进程,在子进程里pc = 0,在父进程里pc = 子进程的进程号。
//子进程和父进程是并行运行的,即同时运行。
//注意:是创建了一个子进程,不是一个子程序,也不是一个新程序。
程序只有一个。
if (pc < 0){printf("Error fork\n");else if (pc == 0) /*子进程*/ //pc=0是子进程,这段是子进程跑的程序。
{sleep(5); //子进程暂停5s/*子进程正常退出*/exit(0);}else /*父进程*/ //pc = 子进程的进程号 > 0,这段是父进程跑的程序。
{/*循环测试子进程是否退出*/do{/*调用waitpid,且父进程不阻塞*/pr = waitpid(pc, NULL, WNOHANG);//pc为子程序进程号。
//NULL是空,即不获取子进程退出时的状态。
//选项WNOHANG,当子进程没有退出时,返回0。
//所以子进程没退出时,pr =0 。
子进程退出时,pr = 子进程进程号。
/*若子进程还未退出,则父进程暂停1s*/if (pr == 0){printf("The child process has not exited\n"); //输出“子进程还未退出”。
sleep(1); //父进程暂停1s}} while (pr == 0); //子进程没退出时,pr =0。
一直做循环,直到 pr = 子进程进程号。
/*若发现子进程退出,打印出相应情况*/if (pr == pc) // pr = pc = 子进程进程号{printf("Get child exit code: %d\n",pr); //输出子进程的进程号}else{printf("Some error occured.\n");}}}将该程序交叉编译,下载到目标板后的运行结果如下所示:$./waitpidThe child process has not exitedThe child process has not exitedThe child process has not exitedThe child process has not exitedThe child process has not exitedGet child exit code: 75可见,该程序在经过5 次循环之后,捕获到了子进程的退出信号,具体的子进程号在不同的系统上会有所区别。
语句 waitpid(pc,NULL,0); 与 wait(NULL); 作用等价。
即 wait() 是 waitpid() 的一个特例。
P217 Linux 守护进程仔细阅读程序,能写注释或填空,写出输出结果。
1、守护进程,也就是通常所说的Daemon进程,是Linux 中的后台服务进程。
3、守护进程常常在系统引导载入时启动,在系统关闭时终止。
4、编写守护进程分5个步骤来创建一个简单的守护进程。
1.创建子进程,父进程退出pid = fork();if (pid > 0){exit(0); /*父进程退出*/}2.在子进程中创建新会话setsid(); //创建一个新的会话,并担任该会话组的组长。
//让进程摆脱原会话、原进程组、原控制终端的控制3.改变当前目录为根目录chdir("/"); //change direct 改变目录,简写为函数 chdir()4.重设文件权限掩码umask(0); //即把文件权限掩码设置为0,文件权限设置为 777 。
5.关闭文件描述符for(i = 0; i < MAXFILE; i++){close(i); // 关闭所有被父进程打开的文件。
关闭相应的文件描述符。
0、1、2默认打开。
//文件描述0为标准输入文件,1为标准输出文件,2为标准错误文件,从3开始为被打开文件。
}这样,一个简单的守护进程就建立起来了。
下面是实现守护进程的一个完整实例,该实例首先按照以上的创建流程建立了一个守护进程,然后让该守护进程每隔10s向日志文件/tmp/daemon.log写入一句话。
/* daemon.c 创建守护进程实例*/#include<stdio.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#include<sys/types.h>#include<unistd.h>#include<sys/wait.h>int main(){pid_t pid;int i, fd;char *buf = "This is a Daemon\n";pid = fork(); /* 第一步 */if (pid < 0){printf("Error fork\n");exit(1);}else if (pid > 0){exit(0); /* 父进程退出 */}chdir("/");/*第三步*/ //更改当前目录为根目录umask(0); /*第四步*/ //设置文件权限掩码为0for(i = 0; i <getdtablesize(); i++) /*第五步*/ //关闭所有被打开文件,通过关闭文件描述符的方式。