linux守护进程的创建

news/2024/7/5 6:57:22

下面的完成了这样一个功能,创建一个守护进程,每个一秒在/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;
}

 

 


http://lihuaxi.xjx100.cn/news/267082.html

相关文章

决策树算法简介

决策树算法简介 决策树思想的来源非常朴素&#xff0c;程序设计中的条件分支结构就是if-else结构&#xff0c;最早的决策树就是利用这类结构分割数据的一种分类学习方法 决策树&#xff1a;是一种树形结构&#xff0c;其中每个内部节点表示一个属性上的判断&#xff0c;每个分…

pymongo分片

#!/usr/bin/python # -*- coding: UTF-8 -*- import time from pymongo import MongoReplicaSetClient from pymongo import MongoClient # 连接单机 # single mongo # c MongoClient(host"192.168.89.151", port27017) # okay # 连接集群 # mongo cluster c Mongo…

一文读懂EfficientNet

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达导读 本文介绍了一种高效的网络模型EfficientNet&#xff0c;并分析了 EfficientNet B0 至B7的网络结构之间的差异。我在一个Kaggle竞赛中翻阅notebooks&#xff0c;发现几…

利用python爬取IP地址归属地等信息!

被使用的例子: IP:202.204.80.112 更多关于IP138的信息&#xff1a;https://blog.csdn.net/weixin_42859280/article/details/83752510 源代码&#xff1a; import requests url "http://m.ip138.com/ip.asp?ip" try:r requests.get(url 202.204.80.112)r.raise…

在字节跳动工作是什么样的体验?

链接&#xff1a;https://www.zhihu.com/question/28881353/answer/1912209855编辑&#xff1a;深度学习与计算机视觉声明&#xff1a;仅做学术分享&#xff0c;侵删作者&#xff1a;爱喝可乐的喵https://www.zhihu.com/question/28881353/answer/128694674工作久了之后&#x…

Linux下通过txt文件导入数据到MySQL数据库

1、修改配置文件 在 /etc/my.conf 中添加 local_infile1 2、重启MySQL >service mysqld restart 3、登录数据库 登录时添加参数 --local-infile >mysql --local-infile -uroot -p 4、进入相应的数据库导入数据转载于:https://www.cnblogs.com/SiriYang/p/10641954.html

List集合的去除重复性练习

package com.java.b.listdmeo.www; import java.util.ArrayList;import java.util.Iterator; import com.java.Student.www.Student; public class listtest { public static void main(String[] args) { //创建一个集合&#xff0c;该集合为List 集合 ArrayList listnew Arr…

10个 Python 工程师,9个不合格!

毋庸置疑&#xff0c;Python越来越被认可为程序员新时代的风口语言。 无论是刚入门的程序员&#xff0c;还是年薪百万的 BATJ 的大牛都无可否认&#xff1a;Python的应用能力是成为一名码农大神的必要项。 所以&#xff0c;很多程序员把Python当做第一语言来学习。 但对于Pytho…