首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    VC下通过进程ID获取进程镜像文件路径的方法及其存在的缺陷

    工作中经常会遇到通过进程ID获取进程镜像文件或者其他模块的路径的需求。...网上有人提出过这样的问题,但是只是说VC提示“类型不一致”,于是就有人说要强制转换。当然强制转换可以解决VC编译通过问题,但是这样做不会有任何效果的。...第二个方案与第一个方案不同之处在于,通过EnumProcessModules获取进程镜像文件模块的HMOUDLE,然后将这个HMOUDLE传给GetMoudleFileNameEx就可以获得该镜像文件的路径...,有些进程是无法被OpenProcess的,如果将调用进程的权限 // 提到“调试”权限,则可能可以打开更多的进程 hProcess = OpenProcess(...break; } // 保存文件路径 cstrPath = szPath; // 查找成功了

    1.6K20

    PHP中的会话

    ,默认系统会把当前的进程设置为会话首进程(使用strace查看),所以当前会话首进程不能使用posix_setsid 创建为会话首进程,只能使用子进程调用此函数 3、当调用此函数后,这个进程会变成组长进程...(); //pid当前进程id ppid 父进程id pgid 会话组id sid 进程的会话id fprintf(STDOUT,"pid=%d,ppid=%d,pgid=%d,sid...show(); while (1){ ; } PHP Copy 我们通过截图可以看到,18880是18879的子进程,18880和18879的组ID和会话ID是一样的,因为父进程是当前bash...进程的子进程,所以继承了父进程的会话ID,而利用pcntl_fork 创建出的子进程则又继承了父进程的信息,所以看到的则是一样的 ---- 设置setsid的程序 function show() {...,子进程19578的 pgid和sid 都是19578,也就满足上面提到技术点的第三点,将自己设置为组长进程和会话首进程 通过命令ps -exj 可以看到,设置setsid的这个进程是没有 pts 控制终端的

    1.2K30

    【linux命令讲解大全】076.pgrep命令:查找和列出符合条件的进程ID

    pgrep 根据用户给出的信息在当前运行进程中查找并列出符合条件的进程ID(PID) 补充说明 pgrep 命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程ID。...每一个进程ID以一个十进制数表示,通过一个分割字符串和下一个ID分开,默认的分割字符串是一个新行。对于每个属性选项,用户可以在命令行上指定一个以逗号分割的可能值的集合。...语法 pgrep [options] 选项 -o:仅显示找到的最小(起始)进程号; -n:仅显示找到的最大(结束)进程号; -l:显示进程名称; -P:指定父进程号; -g:指定进程组...; -t:指定开启进程的终端; -u:指定进程的有效用户ID。...参数 :指定要查找的进程名称,同时也支持类似grep指令中的匹配模式。

    41610

    什么是会话

    ,默认系统会把当前的进程设置为会话首进程(使用strace查看),所以当前会话首进程不能使用posix_setsid 创建为会话首进程,只能使用子进程调用此函数 3、当调用此函数后,这个进程会变成组长进程...我们通过截图可以看到,18880是18879的子进程,18880和18879的组ID和会话ID是一样的,因为父进程是当前bash进程的子进程,所以继承了父进程的会话ID,而利用pcntl_fork 创建出的子进程则又继承了父进程的信息...,所以看到的则是一样的 ---- 设置setsid的程序 function show() { $pid = posix_getpid(); //pid当前进程id ppid 父进程id...200); } //创建成功返回会话id,否则返回 -1 $num = posix_setsid(); if($num == -1){ var_dump('创建会话失败'); }else{...通过命令ps -exj 可以看到,设置setsid的这个进程是没有 pts 控制终端的,满足技术点第四点 注意 19578这个进程的父id是1号进程,但并不意味着,这个进程是孤儿进程,而是由一号进程接管的会话首进程

    1.2K20

    Linux守护进程

    操作系统设计进程组的概念主要就是为了简化对多个进程的管理。 当父进程创建子进程的时候,默认父进程和子进程同属于同一个进程组,进程组的ID等于第一个进程的ID,也就是组长进程的ID。...我们在使用kill杀死进程的时候,可以通过 kill -SIGKILL -进程组ID 来杀死整个进程组内的全部进程。...组长进程可以创建一个进程组,只要进程组中有一个进程存在,那么这个进程组就存在,并且即使组长进程终止也不会影响进程组。进程组的生命周期时从进程组创建到进程组最后一个进程终止或转移到另一个进程组。...总结 进程组:多个进程在同一个组,第一个进程默认是进程组组长。 会话:进程组的上一级,多个进程组对应一个会话。 创建会话的时候,不能使用进程组组长创建,必须使用组员创建。...创建一个守护进程最关键的一步是调用setsid函数创建一个新的session,并成为session leader。 通过 ps aux 可以查看进程是否有依靠的终端,?

    19110

    守护进程「建议收藏」

    操作系统设计的进程组的概念, 是为了简化对多个进程的管理 当父进程, 创建子进程的时候, 默认子进程与父进程属于同一进程组. 进程组ID第一个进程ID(组长进程)....所以, 组长进程标识: 其进程组ID其进程ID 可以使用kill -SIGKILL -进程组ID(负的)来将整个进程组内的进程全部杀死 组长进程可以创建一个进程组, 创建该进程组中的进程, 然后终止....只要进程组中有一个进程存在, 进程组就存在, 与组长进程是否终止无关 进程组生存期: 进程组创建到最后一个进程离开(终止或转移到另一个进程组) 一个进程可以为自己或子进程设置进程组ID 总结 进程组   ...进程的组长     组里边的第一进程     进程组的ID–> 进程组的组长的ID   进程组组长的选择     进程中的第一个进程   进程组ID的设定     进程组的id就是组长的进程...组长进程不能成为新会话首进程,新会话首进程必定会成为组长进程。 setsid pid_t setsid(void); 创建一个会话,并以自己的ID设置进程组ID,同时也是新会话的ID。

    59840

    linux系统编程之进程(五):终端、作业控制与守护进程

    需要注意的是,使用 nohup 时的父进程id 为终端的进程id,使用 setsid 时的父进程id 为 1(即 init 进程 id)。...四、创建守护进程步骤 调用fork(),创建新进程,它会是将来的守护进程 在父进程中调用exit,保证子进程不是进程组组长 调用setsid创建新的会话期 将当前目录改为根目录 将标准输入、标准输出...、标准错误重定向到/dev/null 成功调用setsid函数的结果是: 创建一个新的Session,当前进程成为Session Leader,当前进程的id就是Session的id。...创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组的id。 如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进程。.../daemon 可以看出守护进程的ID也是进程组的ID,也是会话期的ID,此外这个会话期没有前台进程组。

    2.7K90

    【linux命令讲解大全】189.常用的Linux命令详解

    setsid 在新的会话中运行程序 补充说明 setsid 命令子进程从父进程继承了:SessionID、进程组ID和打开的终端。子进程如果要脱离这些,代码中可通过调用 setsid 来实现。...而命令行或脚本中可以通过使用命令 setsid 来运行程序实现。setsid 帮助一个进程脱离从父进程继承而来的已打开的终端、隶属进程组和隶属的会话。...而不使用默认配置文件 -k:向 squid 服务器发送指令 -s:启用 syslog 日志 -z:创建缓存目录 -C:不捕获致命信号 -D:不进行 DNS 参数测试 -N:以非守护进程模式运行 -X:强制进入完全调试模式...-u:代理认证用户名 参数 URL:指定操作缓存中的 URL ssh-copy-id 把本地的 ssh 公钥文件安装到远程主机对应的账户下 补充说明 ssh-copy-id 命令可以把本地主机的公钥复制到远程主机的...语法 ssh-copy-id [-i [identity_file]] [user@]machine 选项 -i:指定公钥文件 实例 1、把本地的 ssh 公钥文件安装到远程主机对应的账户下: ssh-copy-id

    10710

    Linux - 请允许我静静地后台运行

    进程组 进程组是一个或多个进程的集合,进程组方便了对多个进程的控制,在进程数较多的情况下,向进程组发送信号就行了。 它的 ID 由它的组长进程的进程 ID 决定。...组长进程创建了进程组,但它并不能决定进程组的存活时间,只要进程组内还有一个进程存在,进程就存在,与组长进程是否已终止无关。...我们要实现后台执行的目的,实际上是要完成如下两个目标: 使进程让出前台终端,让我们可以继续通过终端与系统进行交互。...创建过程 要创建一个守护进程,步骤为: 必选项 fork 子进程,退出父进程,子进程作为孤儿进程被 init 进程收养; 使用 setsid, 打开新会话,进程成为会话组长,正式脱离终端控制; 设置信号处理...; // 父进程直接退出 } elseif ($pid < 0) { throw_error(); // 进程创建失败 } posix_setsid(); // setsid成为会话领导进程

    1.7K50

    Linux进程关系

    调用 fork() 的进程称为父进程,而被 fork() 创建出来的新进程称为子进程。父进程和子进程可以通过共享部分资源(如文件描述符)进行协作。...每个进程组有一个组长进程,其进程 ID 就是进程组的 PGID。 通过在组长进程的 ID 前加负号,可以对整个进程组执行操作。 即使组长进程终止,只要组内仍有其他进程,该进程组依然存在。...新创建的进程会继承其父进程的进程组 ID,除非显式改变。...获取进程组 ID:通过 getpgrp() 和 getpgid() 系统调用,用户可以获取进程的进程组 ID: pid_t getpgid(pid_t pid); // 获取指定进程的进程组 ID pid_t...创建新会话:通过 setsid() 系统调用,当前进程可以创建一个新的会话,并成为该会话的会话首领和新的进程组组长: pid_t setsid(void); 调用成功后,setsid() 返回新的会话

    4900

    Linux内核编程--进程组和守护进程

    会话和进程组 进程组:进程组是多个进程的集合, 接收同一个终端的各类信号信息。进程调用setpgid(pid, pgid)可以加入一个现有的进程组或者创建一个新的进程组。...进程组长(头部进程):每个进程组都有一个进程组ID, 每个进程组都有一个组长(头部进程), 在大部分系统中, 进程组ID一般就是头部进程ID。获得一个进程所在的进程组ID用getpgid(pid)。...会话的创建: 进程调用setsid函数创建一个新的Session,并成为Session Leader a.调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1。...fork创建的子进程和父进程在同一个进程组中,进程组的Leader必然是该组的第一个进程,所以子进程不可能是该组的第一个进程,在子进程中调用setsid就不会有问题了。...子进程继承了父进程的进程组ID,不过它有自己的进程ID,这就保证了子进程不是一个进程组的头部进程 Step.3 调用setsid( ),给守护进程创建一个新的进程组和会话,使当前进程成为新进程组的头部进程

    3K20

    PHP 编写守护进程

    在子进程中创建新会话 这个步骤是创建守护进程中最重要的一步,在这里使用的是系统函数 setsid。setsid 函数用于创建一个新的会话,并担任该会话组的组长。...调用 setsid 的三个作用:让进程摆脱原会话的控制、让进程摆脱原进程组的控制和让进程摆脱原控制终端的控制。...在调用 fork 函数时,子进程全盘拷贝父进程的会话期 (session,是一个或多个进程组的集合)、进程组、控制终端等,虽然父进程退出了,但原先的会话期、进程组、控制终端等并没有改变,因此,那还不是真正意义上使两者独立开来...setsid 函数能够使进程完全独立出来,从而脱离所有其他进程的控制。 改变工作目录 使用 fork 创建的子进程也继承了父进程的当前工作目录。...exit('parent process'); } //在子进程中创建新的会话 if (posix_setsid() === -

    1.7K20

    进程组、会话、控制终端概念,如何创建守护进程?

    • PGID进程组ID 进程组内的所有进程都有相同的PGID,等于该组组长的PID。(进程组组长:进程组中有一个进程担当组长。进程组ID(PGID)等于进程组组长的进程ID。...已知一个进程,要得到该进程所属的进程组ID可以调用getpgrp。一个进程可以通过另一个系统调用setpgrp来加入一个已经存在的进程组或者创建一个新的进程组。...如果内核支持_POSIX_JOB_CONTROL(该宏被定义)则内核会为Shell 上的每一条命令行(可能由多个命令通过管道等连接)创建一个进程组。...一个进程调用setsid()函数后,会发生如下事件: • 首先内核会创建一个新的会话,并让该进程成为该会话的leader进程, • 同时伴随该session的建立,一个新的进程组也会被创建,同时该进程成为该进程组的组长...• 让进程摆脱原进程组的控制。 • 让进程摆脱原控制终端的控制。 复制代码 那么,在创建守护进程时为什么要调用setsid()函数呢?

    1.5K20

    教你写一个守护进程

    通过命令"ps -ajx"查看系统所有的进程,如下所示: TTY 一栏是问号?...第二,虽然子进程继承了父进程的进程组ID,但它有自己独立的进程ID,这保证了子进程不是一个进程组的组长进程,这是下面将要调用 setsid 函数的先决条件! 子进程调用 setsid 创建会话。...setsid()函数创建新的会话,由于之前子进程并不是进程组的组长进程,所以调用 setsid()会使得子进程创建一个新的会话,子进程成为新会话的首领进程,同样也创建了新的进程组、子进程成为组长进程,此时创建的会话将没有控制终端...所以这里调用 setsid 有三个作用:让子进程摆脱原会话的控制、让子进程摆脱原进程组的控制和让子进程摆脱原控制终端的控制。...exit(0); //直接退出 /* *子进程 */ /* 1.创建新的会话、脱离控制终端 */ if (0 > setsid()) { perror("

    1.6K30

    AirPlay Deamon学习(Linux Daemon)

    一个进程只能为它自己或子进程设置进程组ID号 会话期: 会话期(session)是一个或多个进程组的集合。...setsid()函数可以建立一个对话期: 如果,调用setsid的进程不是一个进程组的组长,此函数创建一个新的会话期。...(4)为了保证这一点,我们先调用fork()然后exit(),此时只有子进程在运行 (创建)编写守护进程的步骤: (1)在父进程中执行fork并exit推出; (2)在子进程中调用setsid函数创建新的会话...登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。 控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。...可以通过使进程不再成为会话组长来禁止进程重新打开控制终端: if(pid=fork()) exit(0);//结束第一子进程,第二子进程继续(第二子进程不再是会话组长) 关闭打开的文件描述符 进程从创建它的父进程那里继承了打开的文件描述符

    1.2K30

    从进程组、会话、终端的概念深入理解守护进程

    进程组中有一个进程组长,组长的进程 ID 是进程组 ID(PGID) $ ps -o pid,pgid,ppid,comm | cat PID PGID PPID COMMAND 10179...10179 10177 bash 10263 10263 10179 ps 10264 10263 10179 cat 下边通过简单的示例来理解进程组 bash:进程和进程组ID都是 10179,父进程其实是...sshd(10177) ps:进程和进程组ID都是 10263,父进程是 bash(10179),因为是在 Shell 上执行的命令 cat:进程组 ID 与 ps 的进程组 ID 相同,父进程同样是...这么做的原因有 2 点: 如果守护进程是通过 Shell 启动,父进程退出,Shell 就会认为任务执行完毕,这时子进程由 init 收养 子进程继承父进程的进程组 ID,保证了子进程不是进程组组长,因为后边调用...setsid()要求必须不是进程组长 2、子进程创建新会话 调用setsid()创建一个新的会话,并成为新会话组长。

    1.1K20

    带着老李折腾山寨Workerman(四)

    这里我们要引入进程组、会话组的概念了: 进程组:一坨相关的进程会抱团组成一个进程组,每个进程组有一个组长,进程组ID等于组长进程的PID;只有当进程组里没有一个活着的进程了,这个进程组就算彻底完犊子了...关于会话组的重点难点,在这里,下面这些用红线圈住,考试要考的: 一、使用setsid()函数可以创建一个新的会话组 二、组长进程(此处你可以暂时认为是父进程)无法调用setsid,会报错 三、非组长进程...(此处你可以粗暴认为是子进程)可调用setsid创建出一个新的会话组,这个行为会导致[ 该进程会创建一个新的进程组且自身为该进程组组长,该进程会创建出一个新的会话组且自身为该会话组组长,该进程会脱离当前命令行控制终端...php $i_pid = pcntl_fork(); // 在子进程中... if ( 0 == $i_pid ) { // setsid创建新会话组 if ( posix_setsid()...if ( 0 == $i_pid ) { // setsid创建新会话组 if ( posix_setsid() < 0 ) { exit(); } //

    82431
    领券