-
linux 进程(关于守护进程、检查一个进程是否活着、如何写一个进程号文件)
2017-03-20 16:31:32一是如何实现一个守护进程,二是如何检测一个进程是否活着,三是保证某一执行文件只有一个实例在运行。 /* * 1.守护进程 */ 守护进程的最大特点就是脱离了中断,Linux提供了一个系统调用daemon(),要...本文主要包括三个部分:
一是如何实现一个守护进程,二是如何检测一个进程是否活着,三是保证某一执行文件只有一个实例在运行。/*
* 1.守护进程
*/守护进程的最大特点就是脱离了中断,Linux提供了一个系统调用daemon(),要想自定义实现的话,主要包括以下六个步骤:
1.第一步是使用umask函数,把所有的文件屏蔽字置0。文件屏蔽字是可以继承的,当你有相关操作时,如果你要创建一个文件,继承过来的屏蔽字可能阻止你创建相关属性的文件。比如:如果你明确的创建一个文件为组可读,组可写。如果你没有把屏蔽字清零,那么继承过来的屏蔽字可能不允许你添加这两个属性。
2.第二步,创建一个子进程,并且令父进程退出。这样做有以下几个好处:一,如果守护进程是一个简单的shell命令启动的,那么父进程的终止可以使shell认为这个命令已经执行结束了。二,子进程继承了父进程的组ID,但又有自己的进程ID,所以我们可以保证目前的子进程不是进程组长。这一步也是我们接下来要用到的setid函数之前的必要条件。
3.使用setsid函数创建一个新的对会话。首先,该进程变为一个新的会话组的会话头。其次,成为了新的进程组的组长。最后该进程不再控制终端。在system V 下,一些人建议在此时重新fork一次,并且令父进程退出。第二个子进程仍然是一个守护进程。这样做可以保证当前进程不是一个会话组的组长,这样就可以防止他获得控制终端的能力。作为选择,为了防止获得终端的控制权,确定打开终端驱动时明确设置O_NOCTTY。
4.把当前工作目录变为根目录。当前的工作目录是继承父进程的。守护进程是一直存在的,除非你重启计算机。如果你的守护进程是挂载到文件系统上的,那这个文件系统就不能卸载掉。
5.不需要的文件描述符应当关掉。这样可以防止守护进程持有从父进程继承过来的文件描述符。我们可以获取最大的文件描述符,或者使用getrlimit函数来决定最大的文件描述符的值。并且全部关闭。(非必要)
6.一些守护进程把0,1,2这三个文件描述符指向/dev/null,这样的话,当库函数试图通过标准输入输出,标准错误时是没有效果的。当一个守护进程脱离了终端时,就没有地方打印信息;也没有地方接收来自用户的交互式输入。甚至当一个守护进程从一个交互式的会话开始,守护进程在后台运行,登陆会话关闭也不会影响到守护进程。如果其他用户用同样的终端登陆,我们不用设想从守护进程打印信息到终端,也别指望用户读取守护进程。
以上主要参考:http://www.cnblogs.com/iceocean/articles/1650475.html
/*
* 2.如何检查一个进程是否活着
*/
判断一个进程是否活着,我们主要是通过kill这一系统调用来完成,先看一下kill的manual page:- #include <sys/types.h>
- #include <signal.h>
- int kill(pid_t pid, int sig)
- DESCRIPTION
- The kill() system call can be used to send any signal to any process
- group or process.
- If pid is positive, then signal sig is sent to pid.
- If pid equals 0, then sig is sent to every process in the process group
- of the current process
- If pid equals -1, then sig is sent to every process for which the call-
- ing process has permission to send signals, except for process 1
- (init), but see below.
- If pid is less than -1, then sig is sent to every process in the pro-
- cess group -pid.
- If sig is 0, then no signal is sent, but error checking is still per-
- formed.
- if you can send a signal to PID, and returns 1 if you can't (don't have access or invalid PID)。
所以kill(pid,0)可以用于检测一个为pid的进程是否还活着[在shell下面可以用ps来查找],基本逻辑如下:- if(kill(pid,0)!=0)
- it's dead.
- else
- it's alive.
/*
*3.保证某一执行文件只有一个实例在运行
*/
这样的需求主要是解决保证只有同时只有一个这样的进程在运行,像mysql都这样处理:
1.启动进程后,先检查pid文件是否存在,存在则读取之前写入的pid,然后用上面的kill(pid,0);来检查是否活着,
2.活着则退出进程,不允许再启动一个进程,否则启动并将当前的pid写入pid文件。写入的时候要锁住文件,避免
其他进程也往里面写,主要是lockf这个系统调用,方法是:- /**
- * @Brief write the pid into the szPidFile
- *
- * @Param szPidFile name of pid file
- */
- void writePidFile(const char *szPidFile)
- {
- /*open the file*/
- char str[32];
- int lfp = open(szPidFile, O_WRONLY|O_CREAT|O_TRUNC, 0600);
- if (lfp < 0) exit(1);
- /*F_LOCK(block&lock) F_TLOCK(try&lock) F_ULOCK(unlock) F_TEST(will not lock)*/
- if (lockf(lfp, F_TLOCK, 0) < 0) {
- fprintf(stderr, "Can't Open Pid File: %s", szPidFile);
- exit(0);
- }
- /*get the pid,and write it to the pid file.*/
- sprintf(str, "%d\n", getpid()); // \n is a symbol.
- ssize_t len = strlen(str);
- ssize_t ret = write(lfp, str, len);
- if (ret != len ) {
- fprintf(stderr, "Can't Write Pid File: %s", szPidFile);
- exit(0);
- }
- close(lfp);
- }
-
用PowerShell查找一个进程的父进程
2015-06-18 22:27:15在Windows中,我们打开进程任务管理器的时候会发现有许许多多的进程,但是当你点击一个进程的时候就会发现他还包含有一些子进程,可能已经没有在做任何处理了,或者夜有可能是某些病毒木马恶意进程,一般没有专用的...在Windows中,我们打开进程任务管理器的时候会发现有许许多多的进程,但是当你点击一个进程的时候就会发现他还包含有一些子进程,可能已经没有在做任何处理了,或者夜有可能是某些病毒木马恶意进程,一般没有专用的软件是无法查看具体某一进程的父进程是什么的,今天我们用PowerShell来查看某一进程的父进程。
如上代码,可以查看notepad进程的父进程是什么,我们一步步来拆解一下:$process = Get-Process -Name notepad $id = $process.Id $instance = Get-CimInstance Win32_Process -Filter "ProcessId = '$id'" $instance.ParentProcessId $parentProcess = Get-Process -Id $instance.ParentProcessId $parentProcess
我们首先获得要查看进程的对象信息
在获得进程对象信息后,在提取该进程的ID号$process = Get-Process -Name notepad
在获得ID号后,我们这里使用Win32-Process WMI的方法来过滤出我们的进程,并得到该进程的数据对象。$id = $process.Id
当用WMI的方法过滤得到我们的进程后,我们就可以直接调用ParentProcessId属性来得到我们的父进程Id号了。$instance = Get-CimInstance Win32_Process -Filter "ProcessId = '$id'"
既然最终得到ParentProcessId号后,我们就可以用Get-Process方法查找出到底哪个进程是我们的父对象了。$instance = Get-CimInstance Win32_Process -Filter "ProcessId = '$id'" $instance.ParentProcessId
$parentProcess = Get-Process -Id $instance.ParentProcessId $parentProcess
-
在 Linux 中杀死一个进程
2018-06-25 10:40:34在 Linux 中,假如一个进程的 PID 为 3810,那么结束一个进程可以使用如下命令: $ kill -9 3810 以 Postman 为例,首先我们需要找到它的进程号,然后才能杀死。 查找进程号使用 ps 命令,不过有一个强大的参数 -...在 Linux 中,假如一个进程的 PID 为 3810,那么结束一个进程可以使用如下命令:
$ kill -9 3810
以 Postman 为例,首先我们需要找到它的进程号,然后才能杀死。
查找进程号使用
ps
命令,不过有一个强大的参数--forest
可以显示进程树,当杀死父进程的时候,它的呼出进程也一并杀死。$ ps -e --forest | grep Postman
上图中,Postman
的父进程号为3810
,它还呼出了几个子进程,我们将父进程杀死:$ kill -9 3810
这样就将
Postman
清理掉了。在应用程序挂了无响应时,这个命令可以帮助我们强制退出,非常好用。 -
ps -ef | grep apache 查看进程时,出现有一个进程id一直在变化
2020-04-28 15:35:36当我们查看进程,准备 kill 进程时,会出现一种情况,有一个进程的 进程id 一直在变化 注意:每一行会出现两个进程号,前一个是自己的进程id,后一个是父级的进程id 如上图,16272,16312,两次都不一样,最后...当我们查看进程,准备 kill 进程时,会出现一种情况,有一个进程的 进程id 一直在变化
注意:每一行会出现两个进程号,前一个是自己的进程id,后一个是父级的进程id
如上图,16272,16312,两次都不一样,最后发现这个进程是当前输入的命令: ps -ef | grep apache 中有 apache ,也就是这个进程,每次输入这个命令,都会是一个新的进程,id自然不一样,这个命令执行完成后,会自然结束。
如果需要排除当前输入的这个命令的进程,命令为 ps -ef | grep apache |grep -v grep
-
c++builder 如何实现一个应用程序只能打开一个进程
2013-05-20 16:00:55主要体现管理类型中录入、修改、删除、增加等操作中,当一个用户,操作了一半,由于别的事情忘记了自己已经打开了一个进程,此时又打开一个进程,做同样的事情。这样做是不是很危险。所以对于这样的情况,为了安全... -
linux 下如何查看一个进程的环境变量
2018-03-13 23:18:06原理:当一个进程执行时,linux下会生成一个以pid为标志的虚拟文件系统,其中记录了大量关于这个进程的信息。其中environ便记录了环境变量。 第一步:获取进程pid ps -ef | grep 进程名 第二部:cat /proc/pid... -
Linux命令行下杀死一个进程
2018-08-22 14:03:11top命令:可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面,用热键可以管理。 输入top后可以看到如下的界面,实时显示进程情况。 ... -
Linux一个进程最多能开启的线程数
2019-03-22 09:11:35对于一个进程,它在被执行前是一个可执行程序。这个程序是被放在磁盘上的,当它要被执行的时候,它先被加载到内存当中,然后再放入到寄存器中,最后再让cpu执行该程序,这个时候一个静态的程序就变成了进程。 操作... -
一个父进程创建多个子进程,有些需…
2017-06-21 22:51:16在Linux下我们可以用fork函数创建一个子进程,但是当我们需要在一个父进程下创建多个子进程时,有些需要注意的地方。假设我们用如下代码在一个父进程下创建两个子进程: void main() { pid_t pid1, pid2; pid1 = ... -
单个进程监听多个端口及多个进程监听同一个端口
2019-08-27 19:16:52多个进程监听同一个端口(multiple processes listen on same port) 方式1:通过 fork 创建子进程的方式可以实现,其他情况下不行。 当连接到来时,子进程、父进程都可以 accept, 这就是著名的“惊群”问题... -
Linux内核创建一个进程的过程分析
2016-03-18 09:31:23一、关于PCB对于一个进程来说,PCB就好像是他的记账先生,当一个进程被创建时PCB就被分配,然后有关进程的所有信息就全都存储在PCB中,例如,打开的文件,页表基址寄存器,进程号等等。在linux中 -
windows 下一个进程能开多少个线程
2015-08-12 17:39:19进程里面创建线程数收到总线的...当设置为512k时,可以开2244个线程,设置为256k时,可以开3122个线程,所以在我们做sock通信服务器时,需要注意,如果一个客户端 connect进来,就用一个线程对它进程处理的话,服务端 -
两个进程同时访问同一个文件
2019-04-08 09:06:06但是,当多个进程写同一文件时,则可能产生预期不到的结果。(可以使用pread,pwrite)。 总结:两个独立进程打开同一文件,对应不同的file对象,每个进程调用close只影响本进程的“打开文件计数”(file对象的引用... -
linux 只启动一个进程实例
2014-11-01 11:55:42很多应用程序都只应该启动一个运行实例,特别是设计文件IO操作的程序,如果...思路是配置一个pid文件,当程序启动时,对pid文件加锁,然后写入本进程的pid,如果锁失败,说明有实例已经启动了。这个方案非常可靠,唯一 -
C# 如何实现当一个指定的进程(非本身)结束后, 同时也结束掉自己的进程(本身)!
2015-05-29 23:08:48举例. 现在我同时打开了 软件A, 软件B, 软件A 是已经做好的软件或是游戏~ 不是我自己编写的. ...如何实现 在两个软件同时打开的情况下, 关闭掉软件A, 那么软件B也会自动关闭. 关闭掉软件B, 强制结束掉软件A的进程! -
【操作系统】银行家算法,当其中一个进程发出请求时,需要判断系统是否能够将资源分配给它
2019-07-24 09:56:01银行家算法的基本思想是分配资源前,先...Q:在银行家算法中,若出现下述资源分配情况(5 个进程,资源 A/B/C 共 3 类) 假设系统有 A类资源5个,B类资源7个,C类资源 12 个,某一时刻有以下分资源分配 Process Max ... -
用C++实现一个多进程回显服务器
2016-11-28 23:08:51用C++实现一个多进程回显服务器 本案例将用多进程实现一个基于Linux使用C++实现的C/S网络程序:客户端从终端输入,然后借助服务端回显。进而观察TCP的状态转换图,发现多进程网络编程带来的问题。 1. 服务端程序... -
erlang中启动一个gen_server和一个纯粹进程的区别
2015-05-03 20:38:35lib:start_link(M,F,A,Time,SpawnOpts),当该函数被调用的时候,启动gen_server的进程必须wait,直到gen_server进程在执行init_it函数时,调用proc_lib:init_ack将gen_server的进程号返回给启动进程,至此一个gen_... -
当你在终端(shell)中运行一个可执行程序,谁是它的父进程?
2020-07-05 14:41:53Linux系统中,init进程是所有进程的开始,其他进程都是它的子进程或者孙子进程。 -
如果一个进程出了问题,怎么判断它是否运行?能不能重启这个进程?尝试使用守护进程来操作
2016-10-21 22:43:00可以用shell编写一个脚本来判断。...文件屏蔽字是可以继承的,当你有相关操作时,如果你要创建一个文件,继承过来的屏蔽字可能阻止你创建相关属性的文件。比如:如果你明确的创建一个文件为组可读,组 -
PHP 中的一个简单的进程锁
2013-02-21 11:29:13一句话不割: ...但是有时候却不需要多进程,每次只允许一个进程在跑,( f u c ...因为一个进程可能一开始就会去清空临时表,再往临时表插入数据,当这个进程没跑完时,下一个进程如果开始的话,就把临时表的数据清空了 -
一个进程最多可以创建线程的数目
2017-10-02 22:13:47如果使用VS,链接程序开关/SACK 或者/F可以设置线程堆栈大小,默认分配一个线程的堆栈大小是1MB,当CreateThread参数的StackSize大小与链接程序设置的不一致时,采用的方法是谁大用谁的,所以用4K -
cpu内核数与进程、线程是怎样一个关系
2016-09-28 06:47:17我的理解:cpu在进程中来回切换,当一个进程得到cpu后,再在线程中切换,这么理解不知道对不对, 希望能够得到解答。 -
myeclipse2014运行项目后出现两个javaw.exe 如何去掉不是运行项目的一个进程
2018-08-10 09:14:39当我们关闭myeclipse2014自带的Tomcat后发现只剩下一个javaw.exe 的进程 很多小伙伴就问了这不是正常情况么,其实在正常安装完毕myeclipse 2014后的运行状况就是这样子的那么今天我们要做的就是去掉其中一个javaw... -
保证系统中只运行当前程序的一个进程
2007-03-27 18:09:00在学习代码的过程中,遇到了这样一个问题:一个程序,在需求上只允许产生一个进程,即不可重复运行,于是就产生了如何保证系统中只有一个进程存在的问题。这个问题网上的代码很多,不过都是一个解决办法,就是当程序...
-
log宏与条件式编译
-
【布道者】Linux极速入门
-
Java 类和对象
-
通过有源射频锁相实现稳定的光纤时间传输
-
解决问题:这是解决问题的仓库-源码
-
Samba 服务配置与管理
-
项目管理工具与方法
-
CentOS7 安装redis6
-
docker基本使用教程, 以及docker部署flask框架示例
-
将和声搜索算法与杜鹃搜索混合,以进行全局数值优化
-
文本分析项目-源码
-
JavaWeb之MVC三层架构
-
关于绝热演化的一般模型
-
STM32F373XXDataSheet.zip
-
物联网基础篇:快速玩转MQTT
-
响应式编程入门与实战(Reactor、WebFlux、R2DBC)
-
Vue中的动画封装(5-7)
-
2021.2.25日报
-
一天学完MySQL数据库
-
Galera 高可用 MySQL 集群(PXC v5.7+Hapro)