获得有关流程终止的通知

时间:2017-11-11 10:45:34

标签: linux ipc

我正在尝试将NETLINK与CN_IDX_PROC一起使用来监控我的进程。这有效,但需要使用root权限启动监视进程。

我试图通过在我的监视可执行文件(包括CAP_AUDIT_READ,CAP_SYS_ADMIN,CAP_SYS_PTRACE和CAP_IPC_OWNER)上的文件系统中设置一个功能来修复它,但它不起作用,bind()仍然无法说“不允许操作”除非使用sudo开始。

有没有办法让非root用户能够按我想要的方式使用netlink连接器套接字?

如果不是,当其他(非子女,在不同用户帐户下运行)进程终止时,是否还有其他可靠方式可以获得通知?我不想轮询:它是嵌入式软件,我没有太多资源,我希望尽快得到通知。我特别希望在目标进程异常终止时得到通知,例如由于分段错误,所以我不能依赖目标进程进行合作。

在Windows上我只是创建&在目标进程中锁定一个已命名的互斥锁,并使监视进程在其上休眠,保证在所有者进程终止后立即释放互斥锁。 Linux中是否有类似的IPC机制?

2 个答案:

答案 0 :(得分:1)

因此,您希望收到有关流程终止的通知,例如运行一些程序foo

顺便说一句,如果该过程表现良好,您可以在foo的源代码中使用atexit(3)。然后,如果该程序正确退出(通过明确调用exit(3)或从main返回; crt0正好在main之后调用exit(3)返回),注册的例程正在运行。但是,foo过程可能会被某些signal(7)(例如segmentation fault或某个外部kill(1)命令等等)终止,但当然{{}} 3}}没有发生(也不是_exit(2) ....)。

所以写一个简单的包装器程序(例如wrapfoo),其中exit(3) - s然后是fork(2) - s foo在孩子中,而execve(2)在家长。然后,wrapfoo 总是 通知foo结束(包括某些信号终止foo时)。它表现得好像是一个专门的" shell"运行foo(这只是为了解释,wrapfoo 真的是waitpid(2))。

(当然,您不希望运行wrapfoo的流程自行终止)

编码wrapfoo程序非常简单。你应该期望它是正确的。您可以(小心地)使用Unix shell技术让他们使用不同的用户(如果您需要)。请注意,setuid技巧很难,如果不小心可以打开setuid

在某些情况下,您可能会将wrapfoo的C源代码与foo的代码合并,但大部分时间您都不想(security hole原则)。特别是如果你使用危险的setuid技术,你希望你的wrapfoo.c尽可能简单(并且能够证明它的工作方式与你想要的一样)。

阅读一些关于Linux编程的好书,例如:下载旧的separation of concerns(也Advanced Linux Programming;它可以合法免费下载)或更新的东西。 setuid 技术以及herefork(2)execve(2)背后的所有子项都很难解释(所以我甚至不会在这里尝试) 。另请参阅waitpid(2)

也许您可以使用credentials(7),使用一些建议锁定(例如fifo(7)flock(2) ...);当进程死亡时,内核也会释放它们。

答案 1 :(得分:0)

使用带有pthread互斥锁的命名共享内存部分实现了一种解决方法。

Funfact:当因为所有者进程终止而强制释放互斥锁时,另一个进程的pthread_mutex_lock返回EOWNERDEAD代码,但是之后该互斥锁不再可用,该互斥锁上的后续pthread_mutex_lock返回131 = EOTHER错误代码。幸运的是,我只是在同步2个进程,所以我可以在同一个共享内存部分重新创建互斥锁。

复制单个WaitForSingleObject Win32 API的代码量惊人: - (