背景
我正在用C语言编写一个共享库,并使用LD_PRELOAD
进行动态链接,旨在拦截和覆盖应用程序预加载的网络调用,例如socket()
、connect()
、recv()
、send()
等。
在库的初始化中,我使用pthread_create()
启动一个线程。该线程轮询一些内核内存,该内存映射到用户空间。
该库旨在足够通用以处理 - 但不限于 - 网络基准测试应用程序,例如netperf、iperf、sockperf。
我的问题
除了一种情况外,一切正常,大多数情况下都很顺利。那就是守护进程应用程序。例如,如果我将netserver(netperf基准测试应用程序的服务器端)作为守护进程启动,即没有使用-D
参数,那么应用程序做的第一件事就是调用fork()
。在fork时,父进程使用exit(EXIT_SUCCESS)
关闭,而子进程则监听连接。父进程退出会导致我的轮询线程终止。
因此,我想要实现的是:如果父进程已经退出,则子进程生成一个新的轮询线程。我可以拦截和覆盖fork()
调用,但从根本上说,我如何让子进程知道父进程是否已经退出呢?我不能做任何假设,因为这个库必须足够通用。
谢谢。