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 ...
随机推荐
- mysql语句入门
show databases; 展示可以用的数据库: use employees; 进入数据库: show tables; 展示可用的列表. sho ...
- 内核编译报错Fedora20(友善)
首先说明我的宿主机环境:Fedora20 64位,开发板是友善Smart210(S5PV210——Cotex-A8)!!!马上入题! 按照开发板的用户手册来编译内核,一直报这个错误:/opt/Frie ...
- 3d转换-正方体-Html5Css3-遁地龙卷风
(-1) 写在前面 我用的是chrome49,这个案例是从网上看到的,向这位同行致敬,建议大家在记录自己学习感悟时,向我一样加上笔名,被转载的时候还能留下点东西. 在研究slice-box.js的时候 ...
- C#操作mysql数据库
转 http://www.jb51.net/article/43486.htm using System;using System.Configuration;using MySql.Data.My ...
- [MySQL] MySQL存储过程常用的函数
一.字符串类 CHARSET(str) //返回字串字符集 CONCAT (string2 [,... ]) //连接字串 INSTR (string ,substring ) //返回substr ...
- 适配各种Windows分辨率,为DPI添加感知,当在高DPI时,禁用WINFORM缩放等。
因为现在高分屏越来越多,很多windows设备必须设置高DPI,这样很容易导致WINFORM整体错位,因此我们需要自己适配.禁止缩放 在程序配置清单 mainfest中添加如下. <assemb ...
- ajax 设置同步
这个问题总是碰见,但是又总是记不住怎么拼写,这次直接写出来,长期保存. Ajax请求默认的都是异步的 如果想同步 async设置为false就可以(默认是true) 例如: $.ajax({ ...
- 文件描述符、文件表项指针、inode节点的关系
内核使用3种数据结构表示打开的文件,他们之间的关系决定了在文件共享方面一个进程对另一个进程的影响. (1) 每个进程在进程表中都有一个纪录项,纪录项中包含一张打开文件描述符表,每个文件描述符各占一项, ...
- Spring学习(一)
1.既然是学习Spring,我们首先要搞清楚Spring是什么? Spring是分层的.JavaSE/EE一站式的.轻量级的开源框架. 2.Spring的核心 百度百科:Spring是基于IOC和AO ...
- Tomcat7.0+ web.xml问题
Tomcat7+版本的web.xml都加上 <context-param> <param-name>webAppRootKey</param-name> <p ...