.NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计

几年前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是《.NET跨平台实践:用C#开发Linux守护进程.NET跨平台实践:再谈用C#开发Linux守护进程 — 完整篇

这就是本文的初衷。

关于Linux Daemon程序的原理之类的,已经在之前的两篇文章中得到了一些表现,因此,本文就直接上代码,不再在高大上的理论中去兜圈子了。

using System;
using System.Threading;
using System.Timers;
using System.Runtime.InteropServices;
using System.IO;
using System.Text;/************************************************* .Net Core/.Net5+ Linux Daemon示例,作者宇内流云 ************************************************/namespace daemon
{class Program{static unsafe void Main(string[] args){// 进入守护状态int pid = fork();if (pid != 0) exit(0);setsid();pid = fork();if (pid != 0) exit(0);umask(0);// 关闭所有打开的文件描述符int fd_nul = open("/dev/null", 0);for (var i = 0; i <= fd_nul; i++){if (i < 3)Dup2(fd_nul, i);elseclose(i);}// 进入主方法            // (本示例的功能很简单,就是定时向某个文件写入点内容)            DaemonMain(args);}/// <summary>/// Daemon工作状态的主方法/// </summary>/// <param name="aargs"></param>static void DaemonMain(string[] aargs){//启动一个线程去处理一些事情(new Thread(DaemonWorkFunct) { IsBackground = true }).Start();//daemon时,控制台输入、输出流已经关闭// 因此,请不要再用Console.Write/Read等方法//阻止daemon进程退出(new AutoResetEvent(false)).WaitOne();}static FileStream fs;static int count = 0;static void DaemonWorkFunct(){try{fs = File.Open(Path.Combine("/tmp", "daemon.txt"), FileMode.OpenOrCreate);}catch{exit(1);return;}var t = new System.Timers.Timer() { Interval = 1000 };t.Elapsed += OnElapsed;t.Start();}private static void OnElapsed(object sender, ElapsedEventArgs e){var s = DateTime.Now.ToString("yyy-MM-dd HH:mm:ss") + "\n";var b = Encoding.ASCII.GetBytes(s);fs.Write(b, 0, b.Length);fs.Flush();count++;if (count > 100){fs.Close();fs.Dispose();exit(0);}}[DllImport("libc", SetLastError = true)]static extern int fork();[DllImport("libc", SetLastError = true)]static extern int setsid();[DllImport("libc", SetLastError = true)]static extern int umask(int mask);[DllImport("libc", SetLastError = true)]static extern int open([MarshalAs(UnmanagedType.LPStr)] string pathname, int flags);[DllImport("libc", SetLastError = true)]static extern int close(int fd);[DllImport("libc", SetLastError = true)]static extern int exit(int code);[DllImport("libc", EntryPoint = "dup2", SetLastError = true)]static extern int Dup2(int oldfd, int newfd);}
}

以上代码就是Linux环境中,.NetCore或.Net5以上版本的.net程序,以纯代码方式使自身成为标准的Linux守护进程的示例代码,你完全可以将它关键部分借用到自己的真实项目中。使用中如果有什么问题或建议,请加入本人的QQ群作进一点交流。

注:本文为 宇内流云 (邮箱:j66x@163.com)原创作品,用c#开发原生的Linux守护进程相关技术及代码亦属本人首发,如需转载,请注明出处和作者,同时,没有得到本人亲自同意,本文关键代码不得被“借鉴”到其他纸质作品中

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码优化从数据库里查数据

今天写了几行代码&#xff0c;都是从一个表里查数据。而我却查了三次数据库&#xff0c; 代码例子如下&#xff1a; dalclass.GetLie("userName","Student","userId"id); dalclass.GetLie("userClass","Student","user…

一寸照纯红色底图片_和记场下载

新能的事普及棘手源汽依然情车的是件&#xff0c;为王花燃油但和比车相&#xff0c;为王花底解电池和记场下载在没决续基础建设高额问题航、有彻以及前充电成本&#xff0c;它的体量不大依旧&#xff0c;新能形成正在逐渐之势推广尽管局部源汽全球车的所以。第一直接兼老个家话…

学点css基础

中午时间学点css&#xff0c;附带http://www.w3cschool.cc/css/css-tutorial.html这个链接&#xff01; 中午的时间学了这些东西&#xff01;如下图: 附带代码&#xff1a; 1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset&quo…

套套原来是这样装袋的,40个机械动图看懂好像并不容易。。。

今天咱们来多方位的展示机械的魅力1、真在的柔性自动包装线&#xff0c;可以同时实现一条线上多种不同物体的包装&#xff1a;好强大&#xff0c;美中不足的是没有防震包装&#xff0c;容易压坏商品。另外从视频上可以看出来纸板和物品一块出来&#xff0c;纸板出来时已经裁剪好…

python运算符号输入_【Python】【运算符】

【取模】所谓取模运算&#xff0c;就是计算两个数相除之后的余数&#xff0c;符号是%。如a % b就是计算a除以b的余数。用数学语言来描述&#xff0c;就是如果存在整数n和m&#xff0c;其中0 < m < b&#xff0c;使得a n * b m&#xff0c;那么a % b a - n * b m.取模…

云原生开发框架dapr环境搭建:CLI安装和初始化

dapr 是微软的一个云原生&#xff08;Cloud Native&#xff09;开源项目&#xff0c;英文全称&#xff1a;Distributed Application Runtime&#xff0c;中文要翻译的话就是&#xff1a;分布式应用运行时。也就是一个运行时框架&#xff0c;面向云原生架构。dapr官网地址&#…

java map 值排序_使用Java8 Stream API对Map类型按照键或值进行排序

在这篇文章中&#xff0c;您将学习如何使用Java对Map按照键或值进行排序。前几日有位朋友面试遇到了这个问题&#xff0c;看似很简单的问题&#xff0c;但是如果不仔细研究一下也是很容易让人懵圈的面试题。所以我决定写这样一篇文章。在Java中&#xff0c;有多种方法可以对Map…

GDB调试多进程|多线程程序

1. 默认设置下&#xff0c;在调试多进程程序时GDB只会调试主进程。但是GDB&#xff08;>V7.0&#xff09;支持多进程的分别以及同时调试&#xff0c;换句话说&#xff0c;GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值&#xff1a;parent)和detach-on-fork&a…

Informatica bulk与normal模式的深入详解(转)

Bulk 方式进行目标数据的Load&#xff0c;是Informatica提供的一种高性能的Load数据方式。它利用数据库底层机制&#xff0c;依靠调用数据库本身提供的Utility来进行数据的加载。 使用Bulk方式 Load时&#xff0c;Informatica调用Utility进行Load&#xff0c;此方式将绕过数据库…

php学习 基础二

常用流程控制 IF语句的使用 if&#xff08;判断语句&#xff09; { 执行语句体 } 判断语句 &#xff1a;逻辑运算符号 值非0&#xff0c;执行语句 IF ELSE 语句使用 if&#xff08;判断语句&#xff09; { 执行语句体1 } else { …

沙漠上不小心挖了个洞,让这个地狱之门般的巨坑,燃烧了50年

全世界只有3.14 % 的人关注了爆炸吧知识在土库曼斯坦的卡拉库姆沙漠深处&#xff0c;有一个神奇的巨坑&#xff0c;直径约为70米&#xff0c;它无论白天还是黑夜&#xff0c;永远都在燃烧。这个坑的周围一片荒芜&#xff0c;坑里也没有任何明显在助燃的东西但坑内燃烧的大火近5…

不同用户同时并发测压_简单聊聊吞吐量(TPS)、QPS、并发数、响应时间(RT)概念...

1、 响应时间(RT) 响应时间是指系统对请求作出响应的时间。直观上看&#xff0c;这个指标与人对软件性能的主观感受是非常一致的&#xff0c;因为它完整地记录了整个计算机系统处理请求的时间。由于一个系统通常会提供许多功能&#xff0c;而不同功能的处理逻辑也千差万别&…

读《沟通的方法》

众所周知&#xff0c;沟通在工作和生活中是一项非常重要的技能&#xff0c;但很多人却用不好这项技能&#xff0c;最近中秋假期&#xff0c;看完了得到 CEO 脱不花写的《沟通的方法》&#xff0c;觉得很有收获。脱不花没有上过大学&#xff0c;能有今天的成就&#xff0c;超强的…

java 数组下标 变量_Java基础语法:数组

一、简介描述&#xff1a;数组是相同类型数据的有序集合。其中,每一个数据称作一个数组元素&#xff0c;每个数组元素可以通过一个下标来访问它们。基本特点&#xff1a;数组的长度是确定的。数组一旦被创建&#xff0c;它的大小就是不可以改变的。数组元素必须是相同类型&…

STP的初使化过程

STP初使化过程分为网桥角色(根网桥,非根网桥)的确定和端口角色(根端口&#xff0c;指定端口,阻塞端口)的确定&#xff0c;最终端口状态(稳定状态有blocking&#xff0c;forwarding)确定后&#xff0c;树就形成了。 STP端口状态的改变依赖于端口角色的改变和计时器的超时&#x…

CGRect vs CGPoint vs CGSize

l来自http://bengan.javaeye.com/blog/728457&#xff0c;感谢分享&#xff01; ‍ ‍每个视图都使用一个边框定义其界限。这个边框指定了视图的轮廓&#xff1a;其位置、宽度和高度。 我们使用Core Graphics结构宋定义边框矩形。对于边框&#xff0c;这通常表示由原点(CGPoin…

【转】URL编码(encodeURIComponent和decodeURIComponent)

转自http://blog.jhonse.com/archives/2032.jhonse 最近在用CI框架的时候&#xff0c;发现一个问题&#xff0c;URL的GET方式链接时&#xff0c;如果用中文字符的话&#xff0c;就会出现问题&#xff0c;提示&#xff1a;链接字符不通过&#xff0c;于是在网上找了很多方法&…

收藏!这10部关于数学的顶级纪录片,告诉孩子数学跟枯燥不沾边!

全世界只有3.14 % 的人关注了爆炸吧知识学好数学&#xff0c;必须从娃娃抓起&#xff01;数学是人类的高级思维活动&#xff0c;越往顶层走&#xff0c;需要的各种思维能力就越多。所以&#xff0c;要想孩子数学好&#xff0c;首先要帮他“打牢思维的地基”。怎么打&#xff1f…

不确定规划及应用代码_性能测试划分之应用领域

性能测试划分性能测试划分有很多种&#xff0c;测试方法也有很多种&#xff0c;更确切的说是由于测试方法的不同决定了测试划分的情况&#xff0c;但在测试过程中性能测试的划分没有绝对的界限&#xff0c;常用的有压力测试、负载测试和并发用户测试等。性能测试的方法主要包括…

使用SysPrep制作Windows2008系统映像

Windows2008及R2的Sysprep程序位于C:\Windows\System32\Sysprep目录下。 前几天在做实验环境的时候发现一个奇怪的问题&#xff0c;成员服务器加入域时&#xff0c;提示加入域成功&#xff0c;但是本地管理员组里没有Domain Admins组&#xff0c;而且将域帐户加入本地管理员组时…