下面的完成了这样一个功能,创建一个守护进程,每个一秒在/tmp目录下的文件peng.txt中记录当前系统时间。

一、守护进程

守护进程是linux中的后台服务进程,在系统启动时开始运行,在系统关闭时终止。Linux系统中的大多数服务进程都是由守护进程实现的。

二、创建守护进程

  • 创建子进程,父进程退出

此时,子进程变成孤儿进程,在后台运行。此时,子进程表面上脱离了终端(如bash),但是实际上却没有,因为其PGID和SID都是原来的没变。

  • 在子进程中创建新的会话

调用setsid()函数,这样,子进程的GID和sid就都等于子进程pid了,它使子进程完全独立出来,可以使用 kill –9 pid,将其杀死。

  • 改变进程的工作目录为根目录

首先要知道工作目录与当前目录的区别,工作目录默认是当前目录,比如执行函数open(“1.c”,……),时,系统会自动到默认的工作目录(即当前目录)中读取或者创建文件 1.c ,但是通过调用函数 chdir(“/tmp”),可以将工作目录变成/tmp,此后,如果再执行open(“1.c”,……),系统就回到/tmp目录下面读取或者创建文件 1.c;

其次,为什么有改变工作目录?原因是,守护进程的工作目录不可以被卸载!假如你把U盘挂载到了机器上,你没改工作目录,U盘上有一个守护进程的程序,你运行了,那么U盘所挂载的目录就是该守护进程的工作目录,假如守护进程中有写文件和读文件操作,你的U盘就没法卸载了,假如你把工作目录改成/tmp,而/tmp无法卸载,运行U盘上的守护进程后,再与U盘无关,此时你可以卸载U盘,而不会对该守护进程有什么影响,该守护进程已经在内存中了。

通常将守护进程的工作目录设置成 “/”或者“/tmp ”,可以看看/tmp 目录的权限是否够用,一般是 0777。

  • 重设文件权限掩码

将文件权限掩码设置为umask(0),这样可以增加守护进程的灵活性

  • 关闭文件描述符

因为创建子进程时,父进程已经打开了若干文件(比如stdin、stdout、stderr),而守护进程用不到这些文件,所以应该关闭。因此,守护进程已经无法使用诸如printf 、scanf、gets等等。

源代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>int main()
{pid_t pid;int i;FILE *fp;time_t t;if ((pid = fork()) == -1)  //创建子进程
    {perror("fork");exit(-1);}if (pid > 0) exit(0);   //pid>0是父进程,父进程退出
setsid();         //在子进程中建立新会话,使子进程完全独立chdir ("/tmp");   //改变工作目录为/tmpumask(0);        //重设文件权限掩码for (i = 0; i < getdtablesize(); i++)   //关闭已经打开的文件,包括stdin、stdout和stderr,getdtablesize的返回值为固定值close(i);                            //注意getdtablesize()不是函数,而是一个宏定义,为常数。if ((fp = fopen("time.txt", "a")) == NULL)  //打开要写的文件exit(-1);while (1){sleep(1);t = time(NULL);  //获取系统时间fprintf(fp, "%s", ctime(&t));//ctime将time转化为标准格式字符串,返回字符串首地址fflush(fp);  //因为是全缓存,所以为保证实时性,用该用fflush进行刷新。
    }return 0;
}

linux守护进程的创建相关推荐

  1. Linux守护进程的创建(结合nginx框架)

    Linux守护进程的创建(结合nginx框架) 先介绍几个相关函数: int dup2(arg1,arg2):参数一指向的内容赋给参数二,shi的参数二也能访问参数一所指向的内容,并返回新的描述符 i ...

  2. Linux系统编程之--守护进程的创建和详解【转】

    本文转载自:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终 ...

  3. Linux 守护进程创建原理及简易方法

    1:什么是Linux下的守护进程 Linux daemon是运行于后台常驻内存的一种特殊进程,周期性的执行或者等待trigger执行某个任务,与用户交互断开,独立于控制终端.一个守护进程的父进程是in ...

  4. 浅析Linux守护进程、守护进程的创建步骤

    文章目录 何为守护进程 进程组 / 组长进程 / 会话 / 会话首进程 进程组 会话 程序示例 守护进程的创建步骤 创建守护进程程序示例 何为守护进程 守护进程(daemon)是一类在后台运行的特殊进 ...

  5. linux下守护进程的创建和sighup信号

    先来说下我理解的守护进程:守护进程没有控制终端,我觉得可以把它理解为一个后台进程. 本篇文章假设读者知道什么是进程组与会话. 下面看一下unix环境高级编程中守护进程的创建流程: 1.首先在进程中调用 ...

  6. Linux 守护进程,编写(转载)

    设置守护进程过程: 1.创建子进程,父进程退出 2.在子进程中创建新会话 3.改变当前目录为根目录 4.重设文件权限掩码 5.关闭文件描述符 *6.守护进程里,忽略SIGCHLD信号 (即使fork两 ...

  7. 守护进程的创建方法和步骤

    概念:      守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进程.Linux的大多数服务器就是用守护进 ...

  8. .NET跨平台实践:用C#开发Linux守护进程

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

  9. 深入理解Linux守护进程

    深入理解Linux守护进程Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程(daem ...

最新文章

  1. DNS自述:我是如何为域名找到家的
  2. Idea 2018.2.5创建springboot项目依赖包没有的错误
  3. CAS是什么?ABA问题的产生和解决方法
  4. 使用python操作postgresql 查询
  5. mysql hash分区 数目_mysql8 参考手册-HASH分区
  6. 网络的可靠性nyoj170
  7. EXCEL根据条件随机内插若干行及对应数据
  8. linux技术属于什么系,什么云计算技术?想学好这个必须了解的!
  9. 【10.9】每日NLP学术论文推荐
  10. abp框架使用ip访问
  11. HTML5:动漫电影网站设计(html+css+javascript)
  12. 珠联网络棋牌游戏 v2.95a 官方
  13. 为数字添加千分位符号(金额千分位)
  14. Java 类对象基础知识--科普
  15. 基于SSM小区物业管理系统
  16. A站工具姬pc电脑版
  17. 数据如何变成知识(2):数据湖和数据沼泽
  18. SVN提交,报“remains in conflict”错误
  19. Git创建新分支并提交到github
  20. handler原子锁_OC的底层并发API

热门文章

  1. Widgets 整理
  2. iOS-UIButton防止重复点击(三种办法)
  3. 什么是静态UItableView
  4. 016-热更新之FishingJoy一
  5. Android WebView与ViewPager的滑动冲突分析
  6. Linux命令:文本处理工具awk详解
  7. 张高兴的 UWP 开发笔记:横向 ListView
  8. 一天一个Java基础——对象和类
  9. javascript与java的不同之处
  10. 5月“.公司”域名注册总量TOP15:西部数码第四