【发布时间】:2012-09-14 10:16:56
【问题描述】:
背景
我正在用 C 编写一个共享库,与 LD_PRELOAD 动态链接,用于拦截和覆盖来自预加载它的应用程序的网络调用,例如 socket()、connect()、recv()、@987654326 @等
在库的初始化中,我使用pthread_create() 启动一个线程。该线程轮询一些映射到用户空间的内核内存。
该库具有足够的通用性,可以处理(但不限于)网络基准应用程序,例如 netperf、iperf、sockperf.
我的问题
一切正常,生活在大多数情况下都是甜蜜的,除了一个。去魔化的应用程序。例如,如果我启动 netserver(netperf 基准测试应用程序的服务器端)作为守护进程,即没有-D 参数,这是应用程序的第一件事确实是调用fork()。在 fork 上,父级使用 exit(EXIT_SUCCESS) 关闭,子级监听连接。父母退出的事实杀死了我的轮询线程。
所以我想要实现的是让孩子在父母离开时产生一个新的轮询线程。我可以拦截并覆盖fork() 电话,但从根本上说,我怎样才能让孩子知道父母是否离开了?我不能做任何假设,因为库必须是通用的。
谢谢。
【问题讨论】:
-
您需要正确地守护您的应用程序,以便它在自己的进程组中,因此当父进程死亡时它不会得到 SIGHUP。或者你需要忽略 SIGHUP。
-
@JonathanLeffler 所说的 - 在这种情况下 fork() fork() 是你的朋友
-
您可能会在 What's the difference between nohup and a daemon 找到一些帮助。
-
我真的希望他不是设备驱动程序开发人员 - 它可以解释为什么我的打印机不能一直工作;-)
-
@JonathanLeffler,我不认为你明白。首先,我的库必须对应用程序透明。我不能盲目地开始更改进程组和 umasks 和 chdirs。这会使调用应用程序处于奇怪的状态并导致错误。其次,当我希望子进程检测父进程是死了还是还活着时,您建议我应该将子进程与其父进程隔离。