10.3 Linux_并发_创建守护进程

news/2024/10/4 18:03:01/

守护进程创建方法

守护进程是什么:

守护进程又叫精灵进程,是一个生存期较长的进程,通常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。它是一个在后台运行孤儿进程,这使得守护进程不受终端的信息影响(比如ctrl c中断程序),同时守护进行也不能够向终端发送任何信息(标准输入、标准输出、标准错误被关闭)。

具体创建步骤如下:

  • 创建子进程,父进程退出。这使得子进程变为孤儿进程,被init收养后在后台运行。
  • 创建新的会话。这使得子进程成为新的会话组长,脱离原来的会话和进程组。
  • 改变当前工作目录。这一步非必须,目的是让守护进程的工作目录不能被卸载。
  • 重设文件掩码。这一步非必须,目的是创建文件时,权限不受系统默认掩码影响。
  • 关闭标准输入、标准输出、标准错误。这使得子进程不能和终端进行信息交互。

具体代码实现如下:

#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>int main(){pid_t pid;//1.创建子进程,父进程退出if((pid = fork())<0){perror("fork");return -1;}else if(pid > 0){exit(0);//父进程退出}//2.建立新的会话//printf("Debug:before setsid():pid = %d,pgid = %d,sid = %d\n",getpid(),getpgid(getpid()),getsid(getpid()));if(setsid()<0){perror("setsid");exit(0);}//printf("Debug:after setsid():pid = %d,pgid = %d,sid = %d\n",getpid(),getpgid(getpid()),getsid(getpid()));//3.更改工作目录chdir("/");//将工作目录改为根目录,确保工作目录不被卸载//4.重设文件掩码umask(0);//设置掩码为0000//5.关闭标准输入、标准输出、标准错误close(0);close(1);close(2);/*守护进程功能代码........*/return 0;
}

存在的一些问题:

创建子进程,父进程退出后,通过ps -elf | grep xxx 查询,发现父进程的进程号不是1

问题如下图:

原因:这是因为init有许多事情做,在init中创建了一个子进程专门用来收留孤儿进程。

相关函数

1、终端创建守护进程

nohup <程序名> &

2、创建新的会话

函数声明如下:

pid_t setsid(void);

返回值:成功返回调用进程的会话ID,失败返回-1

注意:调用了setsid的进程,既是新的会长,也是新的组长。

3、更改当前的工作目录

函数声明如下:

int chdir(const char *path);

返回值:成功返回0,失败返回-1

path:新的工作目录

4、重设文件权限掩码

函数声明如下:

mode_t umask(mode_t mask);

mask:掩码

注意:这个设置的掩码只影响当前进程,其余进程不受影响。


http://www.ppmy.cn/news/1534542.html

相关文章

C# 字符串(String)的应用说明一

一.字符串&#xff08;String&#xff09;的应用说明&#xff1a; 在 C# 中&#xff0c;更常见的做法是使用 string 关键字来声明一个字符串变量&#xff0c;也可以使用字符数组来表示字符串。string 关键字是 System.String 类的别名。 二.创建 String 对象的方法说明&#x…

【学习笔记】手写一个简单的 Spring IOC

目录 一、什么是 Spring IOC&#xff1f; 二、IOC 的作用 1. IOC 怎么知道要创建哪些对象呢&#xff1f; 2. 创建出来的对象放在哪儿&#xff1f; 3. 创建出来的对象如果有属性&#xff0c;如何给属性赋值&#xff1f; 三、实现步骤 1. 创建自定义注解 2. 创建 IOC 容器…

影响 Linux、Unix 系统的 CUPS 漏洞可导致 RCE

在经过大量炒作和第三方过早泄露信息之后&#xff0c;安全研究员 Simone Margaritelli 公布了有关通用 UNIX 打印系统 (CUPS) 中的四个零日漏洞的详细信息。 这些漏洞可被远程、未经身份验证的攻击者滥用&#xff0c;在易受攻击的 Linux 和类 Unix 系统上实现代码执行。 CUPS…

力扣题解 1928

题目描述&#xff08;困难&#xff09; 规定时间内到达终点的最小费用 一个国家有 n 个城市&#xff0c;城市编号为 0 到 n - 1 &#xff0c;题目保证 所有城市 都由双向道路 连接在一起 。道路由二维整数数组 edges 表示&#xff0c;其中 edges[i] [xi, yi, timei] 表示城市…

Redis: 集群测试和集群原理

集群测试 1 ) SET/GET 命令 测试 set 和 get 因为其他命令也基本相似&#xff0c;我们在 101 节点上尝试连接 103 $ /usr/local/redis/bin/redis-cli -c -a 123456 -h 192.168.10.103 -p 6376我们在插入或读取一个 key的时候&#xff0c;会对这个key做一个hash运算&#xff0c…

C语言-指针

0.引入 int a; //定义了一个整型变量 名为a a 100; // a作为左值, 把100存放到a所对应的存储单元中 int b a; // a作为右值, 取a所对应的存储单元(变量本身)的值, 然后再把这个值存放到变量b对应的空间中 在C语言中, 任何一个变量名 都有两层含义: …

Mac通过ssh连接工具远程登录服务器( Royal TSX安装及使用)

一、Royal TSX软件下载地址 Royal Apps 二、Royal TSX 汉化 汉化包地址&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 三、基础配置 Royal TSX 是一款基于插件的应用&#xff0c;刚安装时还不具备使用条件&#xff0c;需要进行一些基础配置 1 安装基础插件…

JVM 基础、GC 算法与 JProfiler 监控工具详解

目录 1、引言 1.1 JVM内存与本地内存 1.2 JVM与JDK的关系 2、JVM基础 2.1 JVM&#xff08;Java Virtual Machine&#xff09; 2.2 Java与JVM的关系 2.3 JVM的内存结构 2.3.1 堆内存 2.3.2 栈内存 2.3.3 方法区 2.3.4 本地方法栈 2.3.5 程序计数器&#xff08;PC寄存…