Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linuxinit进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作。 一句话,为Linux开发与控制台无关的,需要在后台长时间不间断运行的“服务程序”,Daemon技术是非常重要的。 Daemon程序一般用c/c++开发。不过,我今天要讲的,不是怎么用c/c++开发daemon,而是用C#! 一,创建Daemon程序: 用VS新建一个控制台项目,假设名称是MyDaemon,输入下边的代码: usingSystem.Runtime.InteropServices;usingSystem.Threading;namespaceMyDaemon{classProgram{staticvoidMain(string[]args){intpid=fork();if(pid!=0)exit(0);//设置“会话组长”,与父进程脱离setsid();pid=fork();if(pid!=0)exit(0);//已经进程“守护进程”工作状态了!//关闭所有打开的文件描述符intmax=open(/dev/null,0);for(vari=0;i=max;i++){close(i);}//重设文件掩模umask(0);//执行你的程序过程DaemonMain(args);}///summary///Daemon工作状态的主方法////summary///paramname=aargs/paramstaticvoidDaemonMain(string[]aargs){//你的工作代码...//daemon时,控制台输入输出流已经关闭//请不要再用Console.Write/Read等方法//阻止daemon进程退出while(true){Thread.Sleep();}}[DllImport(libc,SetLastError=true)]staticexternintfork();[DllImport(libc,SetLastError=true)]staticexternintsetsid();[DllImport(libc,SetLastError=true)]staticexternintumask(intmask);[DllImport(libc,SetLastError=true)]staticexternintopen([MarshalAs(UnmanagedType.LPStr)]stringpathname,intflags);[DllImport(libc,SetLastError=true)]staticexternintclose(intfd);[DllImport(libc,SetLastError=true)]staticexternintexit(intcode);}} 然后编译为MyDaemon.exe。 二,部署和运行: .net程序在linux运行,一般都会使用mono这个.net框架,不过,为了简单方便,我这里使用AnyExec来运行这个程序(关于AnyExec,请参阅:不装mono,你的.NET程序照样可以在Linux上运行!)。 1,把MyDeamon.exe放到anyexec的app文件夹; 2,把any这个程序复制为MyDeamon; 3,运行:见证神奇的时间到了!请你在linux控制终端上输入:./MyDaemon,哈哈,怎么没有反应?其实,不是没有反应,是你这个MyDaemon程序已经在后台跑起来了! 输入“ps-ef”,看看! 看到那个MyDaemon了吧!这次运行的PID是,父进程是的PID是1,1是谁?linuxinit! 4,退出daemon程序:daemon程序不会与控制台输入输出进行交互,所以,用Console.ReadLine之类的方法控制进程的退出是不现实的。那么,怎么关闭这个在后台运行的daemon呢?最简办法就是用ps-ef查出这个进程的PID号,然后用kill命令终止它。比如当前运行的这个mydaemon的PID号是,你只需要输入kill-9,就能终止它的运行。 原文白癜风治疗的有效方法北京白癜风哪里看好
|