Linux学习笔记(9)-守护进程
明天学这个!!
——————————————————————————————————————————————————————————
守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件,它不需要用户输入就能运行并提供某种服务。
守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备还是标准错误输出设备的输出都需要特殊处理。
Linux系统有多种创建守护进程的方法,其中最常用的的是使用daemon()函数来创建守护进程:
int daemon(int nochdir , int noclose);
参数 nochdir 如果为零,那么daemon函数将调用进程的目录,设为根目录。否则原有的工作目录不变。
参数 noclose 如果为零,那么daemon将重新定义输入、输出标准。否则不变。
总得来说,守护进程就是一种运行在后台的进程,是无法在控制台直接操作的进程,至于功能,需要自己编写。
现在用daemon函数写个程序,运行之后,每过十秒钟,在一个指定的文件里面写上一句话。
进入编码模式……
#include<stdio.h>
#include<errno.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<time.h>
#include<string.h> char lab_now[]="现在的时间是:";
int main(void)
{
int fd;
time_t curtime; if(daemon(,)<)
{
printf("创建守护进程失败errno=%d.\n",errno);
exit(-);
}
fd = open("/home/vmuser/work/daemon/daemon.txt",O_WRONLY|O_CREAT|O_APPEND,0x777);
if (fd < )
{
printf("创建文件失败!\n");
exit(-);
} while()
{
curtime = time();
char *timestr = asctime(localtime(&curtime));
strcat(lab_now,timestr);
write(fd,lab_now,strlen(lab_now));
sleep();
} return ;
}
花了半个小时,代码编写完毕,途中出现的几个小问题也修改完成!
现在开始做makefile:
EXE=daemon
SRC=daemon.c
OBJ=daemon.o cc=gcc
CFLAG=-g
LCDFLAG= EXE:$(OBJ)
$(cc) $(LCDFLAG) $(SRC) -o $(EXE) OBJ:$(SRC)
$(cc) -c $(SRC) -o $(OBJ) .PHONY:clean
clean:
rm -vfr $(OBJ) $(EXE) daemon.txt
执行编译……

在执行代码之前,文件结构是这样的:

在执行了代码后,文件结构变成了这样:

文件已经建立成功,虽然表面上看,什么也没有,但程序也应该是在后台运行了起来,查看daemon.txt文件,看看是否如自己预料的那般,每隔十秒就答应点信息。
答应的结果如下,很明显,自己的代码有问题。每次都把取得的时间接到lab_now字符串后面,那么这个字符串会无限的变大……哎,真是粗心啊!

——————————————————————————————————————————————
用了一个笨办法,将代码修改如下:
#include<stdio.h>
#include<errno.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<time.h>
#include<string.h> char lab_now[]="现在的时间是:";
int main(void)
{
int fd;
time_t curtime; if(daemon(,)<)
{
printf("创建守护进程失败errno=%d.\n",errno);
exit(-);
}
fd = open("/home/vmuser/work/daemon/daemon.txt",O_WRONLY|O_CREAT|O_APPEND,0x777);
if (fd < )
{
printf("创建文件失败!\n");
exit(-);
} while()
{
curtime = time();
char *timestr = asctime(localtime(&curtime));
strcat(lab_now,timestr);
write(fd,lab_now,strlen(lab_now));
strcpy(lab_now,"现在的时间是:");
sleep();
} return ;
}
添加了将那个字符串lab_now赋值的处理,方法是有点笨,但现阶段是好用就行!
代码运行之后,显示结果如下……

显示结果正确,然后用ps -ef指令来查看一下:

确实,进程正在后台运行!
今天的作业完成!
Linux学习笔记(9)-守护进程的更多相关文章
- linux c语言学习笔记之守护进程
哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处 http://blog.csdn.net/woshixingaaa/archive/2010/06/06/5651095.aspx 守 ...
- linux学习笔记--程序与进程管理
.工作管理 1.前台程序放后台程序 命令后 加 & 2.任务执行时将前台任务任务放到后台中并[暂停] ctr + z 3.jobs 观察后台工作状态 及多少任务在执行,可以通过 help ...
- linux学习(四) -- supervisor守护进程
supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启. 1.安装 apt-get install ...
- Linux学习笔记(六) 进程管理
1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...
- Linux学习笔记——管道PIPE
管道:当从一个进程连接数据流到另一个进程时,使用术语管道(pipe).# include <unistd.h> int pipe(int filedes[2]); //创建管道 pipe( ...
- Linux 学习笔记
Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...
- linux学习笔记2-linux的常用命令
第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...
- linux —— 学习笔记(汇总)
笔记目录:一.系统知识 和 基本概念 二.常用操作 三.系统管理(内存.设备.服务等管理) ...
- Linux学习笔记-林耐斯Notes-Linux就该这么学
Linux学习笔记... 参考的优秀Linux网站: http://www.w3cschool.cn/linux/ http://www.linuxeye.com/ http://linux.vbir ...
- deepin linux学习笔记
目录 deepin linux学习笔记 前言 linux常用命令 ls 显示文件夹内容 cd 切换当前目录 pwd 查看当前工作目录 mkdir 新建文件夹 rm 删除文件或文件夹 mv 移动文件 c ...
随机推荐
- web app开发利器 - iscroll4 解决方案
存在即是道理,iscroll会诞生,主要是因为无论是在iphone.ipod.android 或是更早前的移动webkit都没有提供一种原生的方式来支持在一个固定高度的容器内滚动内容, 这个不幸的规则 ...
- php-fpm优化方法详解
php-fpm优化方法 php-fpm存在两种方式,一种是直接开启指定数量的php-fpm进程,不再增加或者减少:另一种则是开始时开启一定数量的php-fpm进程,当请求量变大时,动态的增加php-f ...
- 配置tomcat系统日志--java eclipse
控制台那里的日志只是部分,有时候报错了我们并没有显示出来,所以需要找到系统日志... 双击tomcat v.80 Service---点击open lauch Configuration--Argum ...
- 取代 Windows Search
windows自带的搜索工具太难用了,总是在你急需的时候提示还没有建立索引,眼皮底下的文件都找不到. 1. everything 适合快速搜索文件名 优点是速度快,非常快,几乎是瞬间就建立好了索引. ...
- JS打开新页面跳转
有时候使用js进行页面跳转,想使用 a 标签中 target="_blank" 形式,跳转打开一个新的页面. 可以使用以下脚本,创建一个 a标签,然后模拟点击操作. 代码如下: ...
- 【EasyUI】 日期格式化
本文经过了测试,解决getFullyear() is not a function等问题 效果如下: 首先: Oracle中字段设置为DATE,MySQL中设置为DATETIME,MyBatis中会自 ...
- DevExpress 标题栏添加搜索功能
上图是效果图 附件示例代码下载
- spark 快速入门 java API
Spark的核心就是RDD,对SPARK的使用入门也就是对RDD的使用,包括action和transformation 对于Java的开发者,单单看文档根本是没有办法理解每个API的作用的,所以每个S ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- linux c/c++
string 字符串操作 操作数的都是 ( char * )型,操作数必须是指向字符串的指针("a"),不能是字符('a'),操作时不考虑末尾的'\0'. size_t strle ...