.NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计
2021/10/6 7:14:42
本文主要是介绍.NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
几年前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是《.NET跨平台实践:用C#开发Linux守护进程》和《.NET跨平台实践:再谈用C#开发Linux守护进程 — 完整篇》。由于当时.net core还很稚嫩,没有在业界得到广泛使用,所以之前这两篇文章的技术是针对Linux+Mono这个环境而言的。现在,.Net Core、.Net5已经大行其道,.Net6也很快就会发行正式版,因此,很有必要再加一篇,阐述一下怎么让.net core以及.net5以上版本的.net程序也能在Linux环境下,以自身的能力成为货真价实的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); else close(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守护进程相关技术及代码亦属本人首发,如需转载,请注明出处和作者,同时,没有得到本人亲自同意,本文关键代码不得被“借鉴”到其他纸质作品中。
这篇关于.NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#