进程:守护进程

一、守护进程的概念

  1. 守护进程是脱离于终端控制,且运行在后端的进程。(孤儿进程)
  2. 守护进程不会将信息显示在任何终端上影响前端的操作,也不会被终端产生的任何信息打断,例如(ctrl+c).
  3. 守护进程独立于控制终端,会周期性执行某个任务。(运行在死循环中)
  4. 守护进程用于:与操作系统启动相关的进程。大多数服务器都是用守护进程实现。

二、创建守护进程的流程

1.创建一个孤儿进程:所有任务运行在孤儿进程中,形式上脱离终端控制

让父进程结束运行,而子进程继续运行

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <errno.h>
#include <pthread.h>
int main(int argc, const char *argv[])
{
	
	int res=fork();
	if(res>0){ //父进程
		exit(0);
	}else if(res==0){ //子进程
		while(1);
	}else{
		exit(0);
	}
	return 0;
}

2.新建会话:使子进程完全独立

setsid函数:创建新的进程组,创建新的会话组

pid_t setsid(void);

返回值:

成功,创建的会话组id sid

3.将当前进程对应的路径切换到根目录

chdir函数:切换路径

int chdir(const char *path);

返回值:

成功返回0

失败返回-1置位错误码

4.设置umask值

mode_t umask(mode_t mask);

功能:设置掩码

参数:

mask:掩码的值

返回值:总是会成功,返回mask

5.进行文件描述重定向

int dup(int oldfd):

功能:拷贝fd,产生一个新的文件描述符nfd

        nfd产生的原则为最小未使用原则,fd和nfd都可以操作同一个文件

        文件fd和nfd共用同一个光标

参数:

        old:旧的文件描述符

返回值:

成功返回nfd,失败返回-1置位错误

int dup2(int oldfd,int newfd)

功能:dup2函数相当于文件描述符的重定向

        把newfd重定向到oldfd中,以后向newfd写内容就是在向oldfd对应的文件中写内容

参数:

oldfd:旧文件描述符

newfd:新文件描述符

返回值:成功返回newfd,失败返回-1置位错误码

(实际使用:其实是吧newfd重新定位为oldfd,需要反过来)

三、代码演示

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <errno.h>
#include <pthread.h>
int main(int argc, const char *argv[])
{
    int res = fork();
    if(res == 0 )
    {//1.创建孤儿进程
	//2.创建会话
	setsid();
	//3.切换到根目录
	chdir("/");
	//4.重设文件掩码:守护进程一般保留文件原有权限
	umask(0);
	//5.创建日志文件
	//getdtablesize:获取进程的最大的文件描述符
	for(int i=3;i<getdtablesize();i++){
		close(i);//把之前开了的文件都关了
	}
	int fd;
	fd=open("my.log",O_RDWR|O_APPEND|O_CREAT,0666);
	if(fd==-1){
		perror("open");
	}
	//6.文件描述符重定向
	dup2(fd,0);
	dup2(fd,1);
	dup2(fd,2);
	//7.开启自己的服务
	while(1){
		write(1,"hello",6);
        putchar(10);
		sleep(1);
	}
	close(fd);
          }
    else if(res > 0)//父进程
    {
        exit(0);
    }
    else
    {
        perror("fork");
        return -1;
    }
    return 0;
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/437965.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Endnote 参考文献 序号对齐

问题描述&#xff1a;想要Engnote插入的参考文献需要后自动对齐&#xff0c;不需要悬挂缩进&#xff0c;悬挂缩进会导致中文和英文文献也对不齐&#xff0c;还有就是参考文献序号从9变成10的时候也会导致文献无法对其。 解决办法&#xff1a; 打开Enfdnote&#xff0c;点击Too…

配置nvm管理nodejs版本的环境详细教程【window版】

nvm( node.js version management) 是 Windows 系统下的一个 Node.js 版本管理工具&#xff0c;它是 Node Version Manager&#xff08;nvm&#xff09;的 Windows 版本&#xff0c;它是基于GO语言开发的工具。该工具允许你在 Windows 系统上轻松地安装、切换和管理多个 Node.j…

网络编程套接字(1)—网络编程基础

目录 一、为什么需要网络编程? 二、什么是网络编程 三、网络编程中的基本概念 1、发送端和接收端 2、请求和响应 3、客户端和服务端 四、常见的客户端服务端模型 1、一问一答模型 2、一问多答模型 3、多问一答模型 4、多问多答模型 一、为什么需要网络编程? 为什么…

腾讯云学生服务器申请入口、续费优惠价格和常见问题解答

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

好书安利:《大模型应用开发极简入门:基于GPT-4和ChatGPT》这本书太好了!150页就能让你上手大模型应用开发

文章目录 前言一、ChatGPT 出现&#xff0c;一切都变得不一样了二、蛇尾书特色三、蛇尾书思维导图四、作译者简介五、业内专家书评总结 前言 ​如果问个问题&#xff1a;有哪些产品曾经创造了伟大的奇迹&#xff1f;ChatGPT 应该会当之无愧入选。仅仅发布 5 天&#xff0c;Chat…

Web自动化测试—webdriver的环境配置

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

YOLOv9电动车头盔佩戴检测,详细讲解模型训练

向AI转型的程序员都关注了这个号&#x1f447;&#x1f447;&#x1f447; 一、YOLOv9简介 YOLOv9是YOLO系列算法的最新版本。YOLO系列算法自2015年首次提出以来&#xff0c;已经在目标检测领域取得了显著的进展&#xff0c;以其快速和准确的特点而广受欢迎。 论文地址&#xf…

9款世界级垂直领域软件架构师Visio平替作图工具!

1 LucidChart 一个基于HTML5的在线流程图绘制和协作应用平台&#xff0c;用户可以通过它方便快速的实现流程图表的绘制&#xff0c;同时还可以实现与他人进行实时的流程图绘制和修改功能&#xff0c;对需要群组协作功能的团队来说&#xff0c;这点非常方便。 由于LucidChart是…

消息队列-Kafka-如何进行顺序消费

全局有序 只有 1 个分区&#xff0c;那这个时候就是能够保证消息的顺序消费。 分区有序 如果我们还是想同时消费多个分区并且保证有序&#xff0c;这个时候我们需要将需要保证顺序的消息路由到同一个分区。 在发送消息的时候我们可以看到&#xff1a; 上面的代码定义了消息…

别再找了,关于免费SSL证书都在这里

免费SSL证书的优点&#xff1a; 成本效益&#xff1a;免费SSL证书可以帮助网站所有者节省资金&#xff0c;特别是对于初创公司或个人网站来说&#xff0c;这是一个很大的优势。提高信任度&#xff1a;通过使用SSL证书&#xff0c;网站可以向访问者展示其对安全性的承诺&#x…

面试题之——事务失效的八大情况

事务失效的八大情况 一、非public修饰的方法 Transactional注解只能在在public修饰的方法下使用。 /*** 私有方法上的注解&#xff0c;不生效&#xff08;因私有方法Spring扫描不到该方法&#xff0c;所以无法生成代理&#xff09;*/ Transactional private boolean test() …

数据结构--堆

文章目录 一、堆的概念二、堆的创建三、堆的插入和删除四、堆的应用1.优先级队列2.堆排序3.TopK问题 一、堆的概念 对于一个关键码序列的集合来说&#xff0c;K{K0&#xff0c;K1,K2,K3…Kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中&#xff0c;并满足…

Vue中如何处理组件间的耦合问题?

在Vue中处理组件间的耦合问题是前端开发中常见的挑战之一。耦合问题指的是组件之间的依赖关系过于紧密&#xff0c;一旦某个组件发生改动&#xff0c;则可能导致其它组件也需要作出相应调整。为了解决这个问题&#xff0c;我们可以采取以下几种方法&#xff1a; 使用事件总线&…

riscv 栈空间静态分析

分析riscv架构的裸机代码中最大栈空间 riscv的基本过程调用标准 1.函数前8个参数用a0~a7传输 2.超过8个的参数使用栈传递 3.函数返回参数到a0,a1寄存器中&#xff0c;返回值保存在ra寄存器中 4.如果子函数有使用s0-s11寄存器&#xff0c;那么在使用前需要将这些寄存器的内…

django中静态资源配置

一&#xff1a;静态资源路径配置 在settins.py中INSTALLED_APPS属性是否存在django.contrib.staticfiles&#xff0c;如果没有加上 静态资源根目录配置 二&#xff1a;静态资源调用 #引入JS <script type"text/javascript" src"/static/js/test.js"&g…

实操keepalived(高可用)+Nginx(四层代理+七层代理),实现高可用、负载均衡以及动静分离

一 vrrp技术 VRRP 相关术语 VRRP能够在不改变组网的情况下&#xff0c;将多台路由器虚拟成一个虚拟路由器&#xff0c;i通过配置虚拟路由器的IP地址为默认网关&#xff0c;实现网关的备份。 协议版本: VRRPv2 (常用) 和VRRPv3:0 VRRPv2仅适用于IPv4网络&#xff0c;VRRPv3适用…

力扣日记3.6-【回溯算法篇】51. N 皇后

力扣日记&#xff1a;【回溯算法篇】51. N 皇后 日期&#xff1a;2023.3.6 参考&#xff1a;代码随想录、力扣 51. N 皇后 题目描述 难度&#xff1a;困难 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将…

【大数据】通过 docker-compose 快速部署 MinIO 保姆级教程

文章目录 一、概述二、MinIO 与 Ceph 对比1&#xff09;架构设计对比2&#xff09;数据一致性对比3&#xff09;部署和管理对比4&#xff09;生态系统和兼容性对比 三、前期准备1&#xff09;部署 docker2&#xff09;部署 docker-compose 四、创建网络五、MinIO 编排部署1&…

插件WebApiClient.JIT的使用方法

我们在项目开发过程中&#xff0c;经常需要调用第三方接口&#xff0c;使用httpclient需要写一堆代码&#xff0c;使用插件WebApiClient.JIT可以简化很多代码量&#xff0c;接下来介绍一下WebApiClient.JIT的使用方式。 添加引用&#xff0c;打开NuGet&#xff0c;查询插件&am…

vue3+element plus 实现百度地图显示路径

添加依赖 <!-- index.html --><script type"text/javascript" src"//api.map.baidu.com/getscript?v3.0&akyI6kBeC9G4LntEWXklE2iNHwRUrmFEQc"></script><script type"text/javascript" src"//api.map.baidu.co…