精华内容
下载资源
问答
  •  一是如何实现一个守护进程,二是如何检测一个进程是否活着,三是保证某一执行文件只有一个实例在运行。 /*  * 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:

    [html] view plain copy
    1. #include <sys/types.h>  
    2. #include <signal.h>  
    3. int kill(pid_t pid, int sig)  
    4.     DESCRIPTION  
    5.     The  kill()  system  call can be used to send any signal to any process  
    6.     group or process.  
    7.     If pid is positive, then signal sig is sent to pid.  
    8.     If pid equals 0, then sig is sent to every process in the process group  
    9.     of the current process  
    10.     If pid equals -1, then sig is sent to every process for which the call-  
    11.     ing process has permission  to  send  signals,  except  for  process  1  
    12.     (init), but see below.  
    13.     If  pid  is less than -1, then sig is sent to every process in the pro-  
    14.     cess group -pid.  
    15.     If sig is 0, then no signal is sent, but error checking is  still  per-  
    16.     formed.  
    17.     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来查找],基本逻辑如下:

    [cpp] view plain copy
    1. if(kill(pid,0)!=0)  
    2.     it's dead.  
    3. else  
    4.     it's alive.  


    /*
     *3.保证某一执行文件只有一个实例在运行
     */
        这样的需求主要是解决保证只有同时只有一个这样的进程在运行,像mysql都这样处理:
        1.启动进程后,先检查pid文件是否存在,存在则读取之前写入的pid,然后用上面的kill(pid,0);来检查是否活着,
        2.活着则退出进程,不允许再启动一个进程,否则启动并将当前的pid写入pid文件。写入的时候要锁住文件,避免
        其他进程也往里面写,主要是lockf这个系统调用,方法是:

    [cpp] view plain copy
    1.     /** 
    2.      * @Brief  write the pid into the szPidFile 
    3.      * 
    4.      * @Param szPidFile name of pid file 
    5.      */  
    6. void writePidFile(const char *szPidFile)  
    7. {  
    8.     /*open the file*/  
    9.     char            str[32];  
    10.     int lfp = open(szPidFile, O_WRONLY|O_CREAT|O_TRUNC, 0600);  
    11.     if (lfp < 0) exit(1);  
    12.   
    13.     /*F_LOCK(block&lock) F_TLOCK(try&lock) F_ULOCK(unlock) F_TEST(will not lock)*/  
    14.     if (lockf(lfp, F_TLOCK, 0) < 0) {  
    15.         fprintf(stderr, "Can't Open Pid File: %s", szPidFile);  
    16.         exit(0);  
    17.     }  
    18.   
    19.     /*get the pid,and write it to the pid file.*/  
    20.     sprintf(str, "%d\n", getpid()); // \n is a symbol.  
    21.     ssize_t len = strlen(str);  
    22.     ssize_t ret = write(lfp, str, len);  
    23.     if (ret != len ) {  
    24.         fprintf(stderr, "Can't Write Pid File: %s", szPidFile);  
    25.         exit(0);  
    26.     }  
    27.     close(lfp);  
    28. }  
    展开全文
  • 用PowerShell查找一个进程的父进程

    千次阅读 2015-06-18 22:27:15
    在Windows中,我们打开进程任务管理器的时候会发现有许许多多的进程,但是你点击一个进程的时候就会发现他还包含有一些子进程,可能已经没有在做任何处理了,或者夜有可能是某些病毒木马恶意进程,一般没有专用的...

    在Windows中,我们打开进程任务管理器的时候会发现有许许多多的进程,但是当你点击一个进程的时候就会发现他还包含有一些子进程,可能已经没有在做任何处理了,或者夜有可能是某些病毒木马恶意进程,一般没有专用的软件是无法查看具体某一进程的父进程是什么的,今天我们用PowerShell来查看某一进程的父进程。

    $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
    如上代码,可以查看notepad进程的父进程是什么,我们一步步来拆解一下:

    我们首先获得要查看进程的对象信息

    $process = Get-Process -Name notepad
    在获得进程对象信息后,在提取该进程的ID号

    $id = $process.Id
    在获得ID号后,我们这里使用Win32-Process WMI的方法来过滤出我们的进程,并得到该进程的数据对象。

    $instance = Get-CimInstance Win32_Process -Filter "ProcessId = '$id'"
    当用WMI的方法过滤得到我们的进程后,我们就可以直接调用ParentProcessId属性来得到我们的父进程Id号了。

    $instance = Get-CimInstance Win32_Process -Filter "ProcessId = '$id'"
    $instance.ParentProcessId
    既然最终得到ParentProcessId号后,我们就可以用Get-Process方法查找出到底哪个进程是我们的父对象了。

    $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 清理掉了。在应用程序挂了无响应时,这个命令可以帮助我们强制退出,非常好用。

    展开全文
  • 我们查看进程,准备 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

     

    展开全文
  • 主要体现管理类型中录入、修改、删除、增加等操作中,当一个用户,操作了一半,由于别的事情忘记了自己已经打开了一个进程,此时又打开一个进程,做同样的事情。这样做是不是很危险。所以对于这样的情况,为了安全...
  • 原理:当一个进程执行时,linux下会生成一个以pid为标志的虚拟文件系统,其中记录了大量关于这个进程的信息。其中environ便记录了环境变量。 第一步:获取进程pid ps -ef | grep 进程名 第二部:cat /proc/pid...
  • Linux命令行下杀死一个进程

    万次阅读 2018-08-22 14:03:11
    top命令:可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面,用热键可以管理。 输入top后可以看到如下的界面,实时显示进程情况。 ...
  • Linux一个进程最多能开启的线程数

    千次阅读 2019-03-22 09:11:35
    对于一个进程,它在被执行前是一个可执行程序。这个程序是被放在磁盘上的,它要被执行的时候,它先被加载到内存当中,然后再放入到寄存器中,最后再让cpu执行该程序,这个时候一个静态的程序就变成了进程。 操作...
  • 在Linux下我们可以用fork函数创建一个子进程,但是我们需要在一个进程下创建多个子进程时,有些需要注意的地方。假设我们用如下代码在一个进程下创建两个子进程: void main() { pid_t pid1, pid2; pid1 = ...
  • 个进程监听同一个端口(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,如果锁失败,说明有实例已经启动了。这个方案非常可靠,唯一
  • 举例. 现在我同时打开了 软件A, 软件B, 软件A 是已经做好的软件或是游戏~ 不是我自己编写的. ...如何实现 在两软件同时打开的情况下, 关闭掉软件A, 那么软件B也会自动关闭. 关闭掉软件B, 强制结束掉软件A的进程!
  • 银行家算法的基本思想是分配资源前,先...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. 服务端程序...
  • lib:start_link(M,F,A,Time,SpawnOpts),该函数被调用的时候,启动gen_server的进程必须wait,直到gen_server进程在执行init_it函数时,调用proc_lib:init_ack将gen_server的进程号返回给启动进程,至此一个gen_...
  • Linux系统中,init进程是所有进程的开始,其他进程都是它的子进程或者孙子进程
  • 可以用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在进程中来回切换,当一个进程得到cpu后,再在线程中切换,这么理解不知道对不对, 希望能够得到解答。
  • 我们关闭myeclipse2014自带的Tomcat后发现只剩下一个javaw.exe 的进程 很多小伙伴就问了这不是正常情况么,其实在正常安装完毕myeclipse 2014后的运行状况就是这样子的那么今天我们要做的就是去掉其中一个javaw...
  • 在学习代码的过程中,遇到了这样一个问题:一个程序,在需求上只允许产生一个进程,即不可重复运行,于是就产生了如何保证系统中只有一个进程存在的问题。这个问题网上的代码很多,不过都是一个解决办法,就是程序...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,124
精华内容 17,249
关键字:

当一个进程