我正在尝试使用netlink和cn_idx_proc来监视我的进程。这是有效的,但需要使用根权限启动监视进程。
我试图通过在我的监控可执行文件(包括cap_audit_read、cap_sys_admin、cap_sys_ptrace和cap_ipc_owner)的文件系统中设置一个功能来修复它,但是它没有工作,bind()仍然无法说“不允许操作”,除非使用sudo启动。
有没有办法让非根用户按我所希望的方式使用NetLink连接器插槽?
如果不是,那么当其他进程(非子进程,在不同的用户帐户下运行)终止时,是否有其他可靠的方法得到通知?我不想投票:这是嵌入式软件,我没有太多资源,我想尽快得到通知。我特别想在目标进程异常终止时得到通知,比如分段错误,所以我不能依赖目标进程的协作。
在windows上,我只需在目标进程中创建并锁定一个命名的互斥体,并使监视进程在其上休眠,保证在所有者进程结束时立即释放互斥体。linux中有类似的ipc机制吗?

最佳答案

因此,您希望得到有关进程终止的通知,例如运行某个程序foo
顺便说一句,如果这个过程运行良好,您可以在foo的源代码中使用atexit(3)。然后,如果程序正确退出(通过显式调用“AA>”或通过从main返回;exit(3)调用“AA>”,在“main返回”之后,注册的例程将在您需要的时候运行。但是,foo进程可以被一些crt0命令(例如aexit(3)或一些外部signal(7)命令等)不幸地终止,那么,segmentation fault当然不会发生(也不会发生)。
因此,编写一个简单的包装程序(例如_exit(2)),它在子代中kill(1)-s,然后在父代中wrapfoo-sfoo。然后您的wrapfoo总是会被通知foo的结束(包括foo被某个信号终止时)。它的行为就像是一个专门的“shell”来运行foo(这只是为了说明,wrapfoo并不是真正的exit(3))。
(当然,您不希望运行wrapfoo的进程本身被终止)
编写wrapfoo程序非常简单。你应该期待它是正确的。你可以(小心地)使用fork(2)技术让他们使用不同的用户(如果你需要的话)。注意setuid技巧是困难的,不小心会打开一个execve(2)
在某些情况下,您可能会将wrapfoo的c源代码与foo的代码合并,但大多数情况下您不希望合并(waitpid(2)原则)。尤其是如果您使用危险的setuid技术,您希望wrapfoo.c尽可能简单(并且能够证明它的工作方式与您希望的一样)。
阅读一些关于Linux编程的好书,例如下载旧的Unix shell(也可以setuid;它是合法的免费下载)或更新的东西。setuid技术和security holeseparation of concernsAdvanced Linux Programming背后的所有微妙之处…很难解释(所以我不会在这里尝试)。另请参见here
也许您可以使用fork(2),使用一些提示锁定(例如execve(2)waitpid(2)…);当进程结束时,内核也会释放它们。

09-04 01:54