博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET跨平台实践:用C#开发Linux守护进程(转)
阅读量:6889 次
发布时间:2019-06-27

本文共 1973 字,大约阅读时间需要 6 分钟。

Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作。

一句话,为Linux开发与控制台无关的,需要在后台长时间不间断运行的“服务程序”,Daemon技术是非常重要的。

Daemon程序一般用c/c++开发。不过,我今天要讲的,不是怎么用c/c++开发daemon,而是用C#!

一,创建Daemon程序:

用VS新建一个控制台项目,假设名称是MyDaemon,输入下边的代码:

using System.Runtime.InteropServices;using System.Threading;namespace MyDaemon { class Program { static void Main(string[] args) { int pid = fork(); if (pid != 0) exit(0); //设置“会话组长”,与父进程脱离 setsid(); pid = fork(); if (pid != 0) exit(0); //已经进程“守护进程”工作状态了! //关闭所有打开的文件描述符 int max = open("/dev/null", 0); for (var i = 0; i <= max; i++) { close(i); } //重设文件掩模 umask(0); //执行你的程序过程 DaemonMain(args); } ///  /// Daemon工作状态的主方法 ///  ///  static void DaemonMain(string[] aargs) { //你的工作代码... //daemon时,控制台输入输出流已经关闭 //请不要再用Console.Write/Read等方法 //阻止daemon进程退出 while (true) { Thread.Sleep(1000); } } [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); } }

然后编译为 MyDaemon.exe。

二,部署和运行:

.net 程序在linux运行,一般都会使用mono这个.net框架,不过,为了简单方便,我这里使用 AnyExec来运行这个程序(关于AnyExec,请参阅:)。

1,把 MyDeamon.exe放到anyexec的app文件夹;

2,把 "any"这个程序复制为 MyDeamon;

3,运行:见证神奇的时间到了!请你在linux控制终端上输入: ./MyDaemon,哈哈,怎么没有反应? 其实,不是没有反应,是你这个 MyDaemon程序已经在后台跑起来了!

输入 “ps -ef”,看看!

看到那个 MyDaemon了吧!这次运行的PID是11618,父进程是的PID是1,1是谁?linux init!

4,退出daemon程序:daemon程序不会与控制台输入输出进行交互,所以,用Console.ReadLine之类的方法控制进程的退出是不现实的。那么,怎么关闭这个在后台运行的 daemon呢? 最简办法就是用ps -ef查出这个进程的PID号,然后用kill命令终止它。比如当前运行的这个 mydaemon的PID号是 11618,你只需要输入 kill -9 11618,就能终止它的运行。

 

 

(本文转自:http://www.cnblogs.com/yunei/p/5352944.html)

转载于:https://www.cnblogs.com/xingbo/p/5354417.html

你可能感兴趣的文章
我的友情链接
查看>>
Android系统各个版本 最新市场份额变换
查看>>
Lotus技巧匯總
查看>>
set,map相关操作
查看>>
论分布式计算与线程并行
查看>>
[iOS Animation]-CALayer 视觉效果-拉伸过滤
查看>>
内置函数和装饰器
查看>>
日志管理
查看>>
IoC容器6——自定义bean属性
查看>>
shell变量定义
查看>>
Linux 下安装软件
查看>>
Rad Studio 10.1 UP1 移动开发 ANDROID目标版本切换
查看>>
windows下JBOSS的安装配置说明
查看>>
MySQL函数和存储过程生成电话号码
查看>>
悟透javascript
查看>>
互相调侃的男女爆笑
查看>>
Objective-c View添加虚线
查看>>
跳槽找工作避坑指南(2019版)
查看>>
我的友情链接
查看>>
解决Windows 7在创建系统映像强制备份D盘(或其他盘)的问题
查看>>