现在我的问题是这样的,我的进程启动后改了共享内存区的一个标志,并把自己的进程号写入共享内存区,我想在进程异常退出后把标识改回去,所以我不知道怎么判断我的进程确实是退出了,如果只根据进程号是否存在,那么有可能新创建的进程使用了之前已退出的进程的进程号。所以如何知道我自己创建的进程确实是死掉了?
做一个flag嘛
建立一个文件如:xxx.pid,进程启动时将pid写入文件,退出时将xxx.pid的内容清空。
编程时,获取xxx.pid里的内容就可以知道进程号是多少,如果为空,name进程就退出了嘛。
或者把进程命名,通过查找进程名字找到进程pid
启动的时候在 /tmp 下写一个 a.pid
运行结束就自己清除掉。
每次运行前检查pid文件是否存在
很多方法,除上上面的,还有就是查/proc/pidxx/下的内容, 比如cmdline就是此程序的启动方式,
比如 cat /proc/73/cmdline 会打印出./test/a.out
在Linux中,如果有进程号,那么在/proc下就有对应的pid目录。此外,还可以用pid文件的方式来获取进程是否存在。
但它们之间有意外情况:
如果pid文件没了,或文件中没有pid值,那么表示进程可能死了,但也可能没死,因为/proc下可能还有pid值对应的目录。
但如果/proc目录下没有pid值对应的目录,内核就一定认为它死了。
所以,你可以通过/proc来获知进程信息。
我个人不懂编程,只是分析/etc/init.d/functions中杀进程的判断方式得出的结论。你可以自己去看看。
每个进程都有一个 EPROCESS 结构,里面保存着进程的各种信息,和相关结构的指针。EPROCESS 结构位于系统地址空间,所以访问这个结构需要有ring0的权限。使用 Win2k DDK 的 KD (内核调试器)我们可以得到 EPROCESS 结构的定义。注意下面的是 Win2k Build 2195 下的 EPROCESS 结构定义
给进程取名或者使用它的id,当需要判断是否为同一个线程时,判断它的名字或id就行
每个进程都有一个 EPROCESS 结构,里面保存着进程的各种信息,和相关结构的指针。EPROCESS 结构位于系统地址空间,所以访问这个结构需要有ring0的权限。使用 Win2k DDK 的 KD (内核调试器)我们可以得到 EPROCESS 结构的定义。注意下面的是 Win2k Build 2195 下的 EPROCESS 结构定义。
linux shell 下执行:
$ps -ef
将显示:
UID PID PPID C STIME TTY TIME CMD
虽然新进程PID与已退出进程PID相同,但CMD不同,可判断是启动了新的进程了。
比较TIME与之前进程不同,也可判断是启动了新的进程了。
进程创建的时候获取其pid,然后使用waitpid() 可以等待进程退出, 进程退出,waitpid()就会返回,就可以做清空的动作了
上面很多都写的是正常情况,我想问题提出主要是基于异常退出时无法获知进程的状态。正常情况下,通过文件、共享内存、信号灯,甚至捕获信号,
都能获得进程存活的信息,但异常的时候,这些都不确定,不是很好使。对系统了解的不够深入,提供点想法供参考,一个是通过查找共享内存,可
以知道PID,然后判断该进程是否与原进程同名,如果共享内存都没了;二个是,该进程定时写信号灯或者共享内存,比如100ms改写一次,其他进程
200ms读一次,5次后该值不变,判断进程挂了。
同时起另外一个进程,在另一个进程里用wait一直等这个进程结束,然后回收资源,应该就可以。