守护进程

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
守护进程
1.让进程在后台执行。方法是调用fork产生一个子进程,然后使得父进程退出。

2.调用setsid创建一个新会话。控制终端,登录会话和进程组通常是从父进程继承下来的,守护进程要摆脱它们,不受它们影响,其方法是调用setsid使进程成为一个会话组长。

    Linux中的进程与控制终端,登录会话和进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。控制端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使进程成为会话组长:setsid();

说明:当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。

如果,调用setsid的进程不是一个进程组的组长,此函数创建一个新的会话期。

(1)此进程变成该对话期的首进程

(2)此进程变成一个新进程组的组长进程。

(3)此进程没有控制终端,如果在调用setsid前,该进程有控制终端,那么与该终端的联系被解除。如果该进程是一个进程组的组长,此函数返回错误。

(4)为了保证这一点,我们先调用fork()然后exit(),此时只有子进程在运行。


编写守护进程的一般步骤步骤:

(1)在父进程中执行fork并exit退出;

(2)在子进程中调用setsid函数创建新的会话;

(3)在子进程中调用chdir函数,让根目录 ”/” 成为子进程的工作目录;

(4)在子进程中调用umask函数,设置进程的umask为0;

(5)在子进程中关闭任何不需要的文件描述符


#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <stdlib.h>

int init_daemon(void)
{
    int pid;
    int i;
    signal(SIGTTOU, SIG_IGN);
    signal(SIGTTIN, SIG_IGN);
    signal(SIGTSTP, SIG_IGN);
    signal(SIGHUP, SIG_IGN);
    pid = fork();
    if(pid > 0)
        exit(0);
    else if(pid == -1)
        return -1;

    setsid();

    pid = fork();
    if(pid > 0)
        exit(1);
    else if(pid == -1)
        return -1;

    for(i = 0; i < NOFILE; close(i++))
        ;
    chdir("/");

    umask(0);

    signal(SIGCHLD, SIG_IGN);

    return 0;
}

int main(void)
{
    time_t now;
    init_daemon();
    while(1)
    {
        sleep(8);
        time(&now);

        printf("系统时间:\t%s\t\t\t\n", ctime(&now));
    }

    return 0;
}


记一次数组越界的BUG (这是19年遇到的一个问题,现在回来看看,有了不一样的收获~) 问题:Android下执行reboot recovery后, 黑屏无输出,重新上电也还是黑屏 具体现象:执行reboot recovery后,进入recovery下黑屏能够输入命令,但是recovery服务已经挂了,busybox reboot 重启后仍然进入recovery;断电后再次上电还是进入recovery。 背景: (1)3月26号发现该问题 (2)3月23号reboot recovery正常 这个问题要怎么解决呢?下面开始我 阅读详情

相关推荐

Linux信号基础

linux信号简单学习与理解,信号原理、以及一些小测试,一些小函数的介绍,希望大家多多支持,都需回持续跟新的。

weixin_50374599的博客 1073

[Android][frameworks][HIDL]使用HIDL新建虚拟HAL以实现system_server与native进程双向通信(二)——踩坑篇

前言 在上一篇中,我们已经搭建好了服务端的代码结构,并且保证编译通过; 但是由于各种坑的存在,我们无法直接让服务端跑起来,因此本篇不是写客户端调用,而是一篇编译规则定义、selinux规则添加等相关的踩坑总集,如果你已经保证服务端已经跑起来了,那么本篇可以跳过,等下一篇吧; 添加编译规则 在device///device.mk或等效的位置添加: PRODUCT_PACKAGES += \ vendor.zsui.hardware.example@1.0 \ vendor.zsui.hardware.example@1.0-service 然后全编译userdebug版本,

Linux:守护进程解析、如何实现守护进程

1、守护进程守护进程也称精灵进程(Daemon),是运行在后台的⼀一种特殊进程。它独立于控制终端且周期性地执行某种任务或等待处理某些发生的事件。守护进程是⼀一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任   务。比如,作业规划进程crond等。Linux系统启动时会启动很多系统

Sharp_UP的博客 1986

Android Service被关闭后自动重启,解决被异常kill 服务

Android Service被关闭后自动重启,解决被异常kill 服务

android服务关不成功,android service不停重启无法关闭

[ 501.470952] init: property_set("ro.boottime.ril-daemon", "501363645125") failed: property already set[ 501.536261] init: Service 'ril-daemon' (pid 7422) killed by signal 1[ 501.542643] init: Send...

weixin_26805597的博客 2074

如何从日志中快速定位Android系统重启?

同样的userId为u0,且为它启动了2次,明显就重启了;可以查看两个时间点的日志确定重启原因。一般来说系统重启都是zygot被干掉了,发送了9就是kill信号,杀掉孵化进程自然就重启了。

jackzhouyu的专栏 1480

Linux下的守护进程

一、什么是守护进程1、守护进程的引入 在现实生活中, 许多大型的软件或服务器必须保证7*24小时(一周7天,一天24小时)无障碍的运行,例如淘宝网、百度搜索引擎、支付宝等等,那么像这样一种要一直运行的程序怎么实现呢?究其本质其实就是我们的守护进程。2、守护进程的定义 守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事

snow_5288的博客 9422

守护进程详解

一、普通进程运行观察 代码示例: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> int main(int argc, char *const *argv) { printf("进程开始执行!\n"); while (1) { sleep(1); //休眠1秒 //printf("休息1秒,

芒种、的博客 5317

< Linux > 守护进程

目录 1、守护进程 守护进程的概念 进程组会话 2、守护进程化的方式 TCP网络程序(守护进程化) TCP网络程序(守护进程化)gitee地址 daemon创建守护进程 nohup命令

bit_zyx的博客 3922

Linux守护进程

Linux 守护进程是一种在后台运行的特殊进程,它们独立于控制终端,周期性地执行任务或提供服务。创建守护进程需要遵循特定的流程,包括创建子进程、创建新会话、改变当前目录、重设文件权限掩码关闭文件描述符。守护进程可以通过systemctlservice或systemd命令来管理。

如无必要,勿增实体。 2343

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

何为守护进程 、进程组 / 组长进程 / 会话 / 会话首进程 、守护进程的创建步骤 、创建守护进程程序示例

ZY-JIMMY 2450

守护进程编程

Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。具有以下特点:守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机才随之一起停止运行;守护进程一般都以root用户权限运行,因为要使用某些特殊的端口(1-1024)或者资源;

qq_73050400的博客 1132

【Linux】守护进程以及实现一个守护进程

1、什么是守护进程守护进程也称为精灵进程,是运行在后台进程的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。 (1)脱离于控制终端并且在后台运行 (2)不受用户登录注销的影响,它们一直在运行着 Linux大多数服务器就是用守护进程实现的,例如:Internet服务器inetd,Web服务器httpd查看系统中的守护进程:使用命令 ps axj 凡是TPGID一

菜鸟成长记 3689

什么是守护进程守护进程的特性

 守护进程守护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生 的事件。他们常常在系统引导装入时启动,在系统关闭时终止。unix系统有很多守护进程,大多数服务器都是用守护进程实现的。比如,网络服务inetd、 Web服务http等。同时,守护进程完成许多系统任务。比如,作业规划进程crond、打印进程lqd等。这里主要说明守护进程的进程结构,以及如何编写守护进

余长富的专栏 2145
上一篇: Linux libconfig配置文件库读取
下一篇: Linux- 线程间同步
destory27
博客等级 码龄10年 140粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值