总结如何创建一个守护进程

如何在Linux下创建一个守护进程 我们可以写一个创造守护进程的函数,在程序运行时调用这个函数从而把这个程序变成一个守护进程。 这个函数需要有以下几个步骤: 子进程等待父进程退出 子进程使用setsid创建新的会话期,脱离控制台 调用chdir将当前工作目录设置为/ umask设置为0以取消任何文件权限屏蔽 关闭所有文件描述符 用sysconf来获取最大的文件描述符个数 将0、1、2定位到/dev/null 下面就是一个创建守护进程的函数了。 void create_daemon(void) { pid_t pid = 0; pi 阅读详情

守护进程是指在后台运行的,没有控制终端与之相连的进程。它独立于控制终端,经常周期性地执行某种任务。

所以要想创建一个守护进程,就要实现满足这两点。

在此之前,要先介绍一下进程组和会话组。


一个进程组可以包含多个进程

进程组中的这些进程之间不是孤立的,他们彼此之间或者存在者父子、兄弟关系,或者在功能有相近的联系。

那linux为什么要有进程组呢?其实提供进程组就是方便管理这些进程。假设要完成一个任务,需要同时并发100个进程,当用户由于某种原因要终止这个任务时,要是没有进程组,就需要一个个去杀死这些进程,设置了进程组后,就可以对进程组中的进程进行每个杀死。


进程

--------------------------------------------- 

每个进程必定属于一个进程组,也只能属于一个进程组。

子进程属于父进程所在的进程组。  

一个进程除了有进程ID外,还有一个进程组ID,每个进程组也有唯一的进程组ID。

每个进程组有一个进程组组长,进程组组长的进程ID和组ID相同


会话    
--------------------------------------------- 
    会话期则是一个或多个进程组的集合。当一个用户登陆一次终端时就会产生一个会话,每个会话有一个会话首进程,即创建会话的进程,建立与终端连接的就是这个会话首进程,也被称为控制进程。通常情况下,用户登录后所执行的所有程序都属于一个会话期,而其登录shell则是会话期首进程,并且它所使用的终端就是会话期的控制终端。当我们退出登录(logout)时,所有属于这个会话期的进程都将被终止。 
    (1). 一次登录形成一个会话 
    (2). 一个会话可包含多个进程组, 但只能有一个前台进程组. 
    (3). setsid()可建立一个新的会话;如果调用该函数的进程不是进程组的领头进程, 该函数才能建立新的会话. 
调用setsid()之后, 调用进程将成为新会话的领头进程. 
 
控制终端 
--------------------------------------------- 
    (1) 会话的领头进程打开一个终端之后, 该终端就成为该会话的控制终端 (SVR4/Linux) 
    (2) 与控制终端建立连接的会话领头进程称为控制进程 (session leader) 
    (3) 一个会话只能有一个控制终端 
    (4) 产生在控制终端上的输入和信号将发送给会话的前台进程组中的所有进程 
    (5) 终端上的连接断开时(比如网络断开或Modem断开), 挂起信号将发送到控制进程(session leader)



怎样编写守护进程:

1. 在后台运行。 
   调用fork产生一个子进程,然后释放掉父进程,也就是说创建一个孤儿进程,此时子进程已经成为后台进程。
    if(pid=fork()) 
    exit(0);//是父进程,结束父进程,子进程继续 
这么做不仅实现了让进程后台运行,同事保证了子进程是父进程创建的,属于父进程所在进程组,所以保证了子进程一定不是进程组组长,为了下一步脱离终端提供保证。
2. 脱离控制终端,登录会话和进程组 
    
   控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使进程成为会话组长:


调用setsid有下面的3个作用:
(1)让进程摆脱原会话的控制
(2)让进程摆脱原进程组的控制
(3)让进程摆脱原控制终端的控制
 也就是说由于创建守护进程的第一步调用了fork函数来创建子进程,再将父进程退出。由于在调用了fork函数时,子进程全盘拷贝了父进程的会话期、进程组、控制终端等,虽然父进程退出了,但会话期、进程组、控制终端等并没有改变,因此,这还不是真正意义上的独立开来,而setsid函数能够使进程完全独立出来,从而摆脱其他进程的控制。

说明:当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。 


3. 禁止进程重新打开控制终端 
     现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端: 
    if(pid=fork()) 
    exit(0);//结束第一子进程,第二子进程继续(第二子进程不再是会话组长) 
为什么要创建两次进程呢? 这是因为第二步结束后,进程创建了一个新的会话组,并成为会话组长,而会话组长可能获得控制终端,如果获得了控制终端那么或这个进程就不是守护进程了。所以添加了这几句代码,让进程失去会话组长的身份,从而没有获得控制终端的权限。
4. 关闭打开的文件描述符 
同文件权限码一样,用fork函数新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下。
在上面的第二步之后,守护进程已经与所属的控制终端失去了联系。因此从终端输入的字符不可能达到守护进程,守护进程中用常规方法(如printf)输出的字符也不可能在终端上显示出来。所以,文件描述符为0、1和2 的3个文件常说的输入、输出和报错)已经失去了存在的价值,也应被关闭。通常按如下方式关闭文件描述符:
for(i=0;i<MAXFILE;i++)
close(i);
5. 改变当前工作目录 
    这一步也是必要的步骤。使用fork创建的子进程继承了父进程的当前工作目录。由于在进程运行中,当前目录所在的文件系统(如“/mnt/usb”)是不能卸载的,这对以后的使用会造成诸多的麻烦(比如系统由于某种原因要进入单用户模式)。因此,通常的做法是让"/"作为守护进程的当前工作目录,这样就可以避免上述的问题,当然,如有特殊需要,也可以把当前工作目录换成其他的路径,如/tmp。改变工作目录的常见函数式chdir。
6. 重设文件创建掩模 
  进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点,将文件创建掩模清除:umask(0); 
7. 处理SIGCHLD信号 
   处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN。 
signal(SIGCHLD,SIG_IGN); 这样,内核在子进程结束时不会产生僵尸进程。




这样,一个简单的守护进程就建立起来了。


DELPHI进程守护源码 运行后,进程无法被关闭,关闭后会自动启动,永远无法结束 立即下载

相关推荐

Delphi写的守护进程.zip

delphi写的一个守护进程,可以在ini中配置你需要守护的程序名称和路径,当检测到程序被关闭后,服务自动启动该程序。

守护进程?竟然这么简单

守护进程         在linux系统中,我们会发现在系统启动的时候有很多的进程就已经开始跑了,也称为服务,这也是我们所说的守护进程。         守护进程是脱离于终端并且在后台运行的进程,脱离终端是为了避免在执行的过程中的信息在终端上显示,并且进程也不会被任何终端所产生的终端信息所打断。         守护进程一般的生命周期是系统启动到系统停止运行,当人,什么都敌不多人,也可以通...

Travelerwz的博客 752

Delphi写的守护进程(服务程序)

delphi写的一个守护进程,可以在ini中配置你需要守护的程序名称和路径,当检测到程序被关闭后,服务自动启动该程序。

delphi pid判断进程结束_linux守护进程的创建

/*=============================================== * 文件名称:protectprocess.c //守护进程 * 创 建 者:追光者 * 创建日期:2020年11月01日 * 描 述:创建守护进程将当前系统时间写入test.txt中。创建步骤:用fork函数创建进程并退出父进程在子进程内用setsid函数创建会话期用chd...

weixin_39584549的博客 292

MinService-最简单的 Delphi 服务程序代码.7z

最简单的 Service 代码:MinService 本代码的基本单元为 MinService.dpr、MinSvcUtils.pas。 我用一个 delphi 2010 生成的 dataSnap 2010 服务模块做例子, 可删除它并根据自己的实际情况调整代码(适用于低版本),写 自己的服务程序时,只需在单元 SvcInstance.pas 中调整即可。 数据库用的时 ib 2009,下载地址:http://www.inbytes.net/html/ib_page.html, 运行客户端前请复制 Delphi 的 dbxint.dll 到程序目录下。

我自己写的守护进程-源码

C++在windows下运行,没有写成服务,只是简单的练手!希望大家共同学习!源码加exe

delphi 双进程守护

这是一个关于父亲与儿子的故事: 父亲的一生:①生一个儿子。如果儿子被杀了,再生一个!              ②工作。 儿子的一生:等着父亲被杀,取而代之(成为父亲)。 这则故事已经完整地表达了我想要表达的全部思想,我们可以通过假设“父亲被杀了”或“儿子被杀了”来领会它。 废话少说,看源码: program Oliver; uses    Windows; procedure WaitForAn...

cfeers 626

Delphi如何关闭一个进程

Delphi如何关闭一个进程,procedure EndProcess(AFileName: string);

服务端守护程序

写程序有时候总是会碰到很多莫名其妙的问题,前两天LIS中间件 加载血气分析仪dll后总是无故自动关闭了,找了一天的av错误,项目现场催着验收,没办法就找了这个折中的法子。 (思路)写一个服务端守护程序,当守护程序检测不到服务端程序的时候 就自动开启服务端程序。 全部源码 我已经上传到 : http://download.youkuaiyun.com/detail/u013051638/97

昵称总是必填 的博客 1435

报错:subprocess.CalledProcessError: Command ‘[‘where‘, ‘cl‘]‘ returned non-zero exit status 1.

右键此电脑--属性--高级系统设置--环境变量--系统变量--找到Path。Enterprise是企业版,如果你是社区版就找Community。2.安装的时候,c++桌面那个需要勾选。

2301_77554343的博客 1506

CVPR2023新作HAT实战:5分钟搞定图像超分辨率重建(附代码)

本文介绍了CVPR2023新作HAT模型在图像超分辨率重建中的实战应用。HAT通过创新的混合注意力机制,显著提升了图像重建质量,能激活更多有效像素并减少伪影。文章提供了从环境配置到模型部署的完整指南,帮助开发者在5分钟内快速实现图像超分辨率重建,并附有代码示例和性能优化技巧。

weixin_29062613的博客 237

创建一个简单的守护进程

下面的内容是看了书上总结来的。 要写这样的一个程序看似复杂,但是它也是遵循一定的规则的。书中的方法介绍了用五个步骤来创建一个简单的守护进程。 1、创建子进程,父进程退出 由于守护进程是在后台运行,脱离了控制终端的,(为什么这样说呢?因为每一个终端运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当终端被关闭的时候,这些进程都会自动关闭。但是,守护进程要突破这种限制,它从

u010511175的专栏 887

ArcGIS | 全球新冠肺炎地图数据下载和处理

ArcGIS

thinkpang的博客 2900

如何创建一个守护进程

1.执行一个fork(),之后父进程退出,子进程继续执行。 子进程会获得一个不同的进程ID,确保不是进程组的组长进程(这一步是第二步的能够实现的条件)。还有一个原因是父进程退出会让shell发出shell提示符,此时子进程会在后台运行有init进程接管。 2.子进程调用setsid()开启一个新会话。 为什么不能是组长进程? 因为调用setsid()的进程会成为一个新的进程组的组长,如果该进程已经是一个进程组的组长,那么就出现了两个同名的进程组。 setsid创建一个新会话并且切断进程与控制终端的关系。 3

glzszz的博客 375

WEBGL Shader零基础教程(四):片元着色器核心逻辑

本文系统介绍了WebGL渲染管线中片元着色器的核心概念与应用。主要内容包括:1)片元着色器在渲染管线中的定位与作用,作为逐像素处理单元接收插值数据并计算最终颜色;2)输入数据类型与使用规则,重点讲解varying变量和uniform变量的应用场景;3)颜色计算的核心逻辑,涵盖基础色、渐变、纹理采样和颜色混合;4)进阶特效实现与性能优化技巧,包括交互效果、内置函数组合和GPU计算优化;5)通过综合案例演示了纹理、波纹与交互效果的整合实现。文章提供了完整的代码示例和调试建议,为后续学习光照模型、后期处理等高级渲

分享知识,拥抱变化 1374

企业信息化系统的组成模块-核心业务系统

通过标准化的数据流形成完整的业务闭环,CRM生成的销售订单驱动ERP的生产和采购,ERP将生产计划传递给MES执行,MES报工数据返回ERP进行成本核算,ERP再将交付信息同步给CRM供客户查询。生产管理确保高效交付,缩短订单周期。某贸易公司实施ERP供应链模块后,库存周转率从每年4次提升到8次,库存资金占用从2000万降到1200万,释放800万现金流,同时缺货率从15%降到5%。│ │库存 │ │ MRP │ │ ERP │ │ 云ERP/ │ │。

weiyvyy的博客 694

创建一个守护进程

参考《后台开发核心技术与应用》第10.4小节。

阿乐的博客 845

Robocorp+Robot Framework学习记录【初学者课程:一级课程】

以下内容均来自:https://robotframework.org/?tab=2#getting-started。通过官网的学习和本地实际安装使用体验而来,本文仅记录学习过程。 Robot Framework介绍 Robot Framework 是一个通用的开源自动化框架。它可用于测试自动化和机器人过程自动化 (RPA)。 Robot Framework环境配置及安装 具体请见:Win10环境下安装pytho、pip与Robot Framework 学习过程与等级划分 官方认为Robot Framew.

OwenDom的博客 5373

如何创建一个简单的守护进程

守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程。它是一个生存期较长的进程,通常独立 于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。   守护进程是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在 执行过程中的信息也不在任何终端上显示。由于在 linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依 附于这个

qq_54251063的博客 243

YOLOv8 TensorRT C++部署实战详解:从XMake构建到推理流水线

本项目实现了一个基于YOLOv8和TensorRT的高性能火灾烟雾检测系统,具有以下核心特点: 技术架构:采用TensorRT 8.6+进行GPU加速推理,结合CUDA 12.1和OpenCV 4.8+,实现高效计算机视觉处理。系统使用XMake替代CMake构建,配置更简洁高效。

hscing的博客 1065

【嘉立创EDA】PCB 多层板如何交换内层,4层板交换板层

本文使用嘉立创EDA,描述如何在PCB设计时,如何交换各个板层,特别是4层板需要交换内层时,应该如何操作,以供有需要的读者参考。

l64481000的博客 2012

怎样创建一个守护进程(C语言基础版)

本文介绍了Linux系统中守护进程的概念与创建方法。守护进程(Daemon)是运行在后台的服务进程,独立于控制终端,通常在系统启动时运行直至系统关闭。创建守护进程需完成五个关键步骤:1)创建子进程并退出父进程;2)在子进程中创建新会话;3)切换工作目录到根目录;4)重设文件权限掩码;5)关闭继承的文件描述符。文中通过C语言示例演示了创建守护进程的完整代码实现,该示例会在/tmp目录下创建日志文件并定时写入数据。守护进程机制有效解决了终端关闭导致进程终止的问题,是构建稳定后台服务的基础技术。

2301_82019104的博客 1667

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Linux系统编程 创建一个守护进程

1.创建子进程 fork 2.子进程创建新会话 setsid() 3.改变进程的工作目录 chdir() 4.指定文件掩码 umask() 5 将文件描述符0\1\2重定向 /dev/null dup2() 6.守护进程逻辑 7.退出。。。一般不用 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<fcntl.h> #include<sys/types.h&

qq_24447809的博客 259

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【Linux】如何创建一个守护进程?

如何创建一个守护进程?   需要最主要的是:为什么会需要两次fork()?因为,第一次fork()将父进程的会话期、进程组相关信息进行了copy,所以这时候的子进程还不能算是独立进程组之外的进程,所以需要将子进程独立处理,所以调用setsid()先判断子进程是否是进程组的组长,如果是之前进程组的组长,那么调用失败,否则调用成功,子线程成为新的进程组组长。这时候调用fork(),将父进程退出...

Forever_ZhangKe的博客 471

如何创建和关闭一个守护进程

如何创建和关闭一个守护进程 2018年1月8日 18:44    1守护进程特点:    1 独立性:独立于终端,用户    2 周期性:不断执行代码       2如何创建:    1 fork 结束主线程 2 setsid 3 关闭或重定向默认文件描述符0,1,2 4 切换工作目录 5 设置掩码       voi

qq_32911237的博客 7145

Linux守护进程概念及创建一个守护进程

Linux守护进程概念及创建一个守护进程

qq_54075859的博客 291
上一篇: linux一些实用小技巧
下一篇: wait和waitpid函数总结
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值