明天学这个!!

——————————————————————————————————————————————————————————

  守护进程(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)-守护进程的更多相关文章

  1. linux c语言学习笔记之守护进程

    哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处 http://blog.csdn.net/woshixingaaa/archive/2010/06/06/5651095.aspx 守 ...

  2. linux学习笔记--程序与进程管理

    .工作管理 1.前台程序放后台程序  命令后 加  & 2.任务执行时将前台任务任务放到后台中并[暂停]  ctr + z 3.jobs 观察后台工作状态 及多少任务在执行,可以通过 help ...

  3. linux学习(四) -- supervisor守护进程

      supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.   1.安装 apt-get install ...

  4. Linux学习笔记(六) 进程管理

    1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...

  5. Linux学习笔记——管道PIPE

    管道:当从一个进程连接数据流到另一个进程时,使用术语管道(pipe).# include <unistd.h> int pipe(int filedes[2]); //创建管道 pipe( ...

  6. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  7. linux学习笔记2-linux的常用命令

    第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...

  8. linux —— 学习笔记(汇总)

    笔记目录:一.系统知识 和 基本概念                    二.常用操作                   三.系统管理(内存.设备.服务等管理)                   ...

  9. Linux学习笔记-林耐斯Notes-Linux就该这么学

    Linux学习笔记... 参考的优秀Linux网站: http://www.w3cschool.cn/linux/ http://www.linuxeye.com/ http://linux.vbir ...

  10. deepin linux学习笔记

    目录 deepin linux学习笔记 前言 linux常用命令 ls 显示文件夹内容 cd 切换当前目录 pwd 查看当前工作目录 mkdir 新建文件夹 rm 删除文件或文件夹 mv 移动文件 c ...

随机推荐

  1. jvm--1.class文件结构

    1.字节码(1)bytecode是构成平台无关性的基石 (2)当jvm发展到1.7-1.8的时候,jvm设计者通过,JSR-292,基本可以让其他语言运行在jvm上面. 如,Clojure , Gro ...

  2. Lua在单片机中的移植

    Lua代码符合ANSI C标准,只要有C编译器的开发环境就能跑Lua. 虽说只要有C编译器就能跑Lua,但是单片机的环境太简单,有些C标准的内容仍旧无法支持. Lua的官网是:www.lua.org ...

  3. check用户协议

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Virtualbox 上调整 Mac OS 分辨率 最简单方法

    Mac OS 分辨率:VBoxManage setextradata "Mac OS X 10.10" VBoxInternal2/EfiGopMode 3       ----代 ...

  5. Cvim的安装与使用

    一.安装cvim插件 第一步:下载cvim的安装包 在linux系统下的浏览器firefox.chrome浏览器中打开下面链接 www.vim.org/scripts/download_script. ...

  6. 功能实现:PLC对LPC的音量控制

    设计方案1: 在PLC上,当使用QDial调节音量时,触发QDial的SIGNAL:ValueChange(),对应SLOT向LPC发送自定义键码0x22; 在LPC上,当接收到0x22键码时,执行操 ...

  7. 解决pip安装超时

    我们在使用python开发的时候总会需要安装很多第三方模块 比如我用flask搭建web, 需要很多第三方模块,比如flask-sqlalchemy, flask-bootstrap等等.而这些模块用 ...

  8. gen_server port 调用receive_match 问题

    问题由来 前些天对系统做了一个优化,将原来从queue 轮询刷出数据后每条消息一个 spawn 进程单独处理,修改为批量刷出.一条一条刷轮询刷 queue 存在问题:刷queue 进程太多时,占用CP ...

  9. - >code vs 1475 m进制转十进制

    1475 m进制转十进制  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解  查看运行结果   题目描述 Description 将m进制数n转化成一个 ...

  10. dom操作导致超级卡顿。。。

    var i=0;j=30;setinterval(function(){ document.getElementId(idname).style.top=j+'px'; i<3?i++:i=0; ...