我正在使用一个执行fork
而没有exec
的网络服务器项目。该程序依赖于OpenSSL,而OpenSSL需要一些锁(CRYPTO_NUM_LOCKS
来确切,目前约为40)。 Linux上的锁通常是pthread_mutex_t
,它们是在创建任何线程之前在主线程上安装/创建的。
fork
创建了一个新流程。但是,在fork
之后,互斥锁中使用的句柄被浅层复制。也就是说,它们具有相同的位,但我不认为它们在新过程的上下文中具有有用的价值。
我认为一般问题是共享对象中的线程和fork安全性。 libcrypto
上的OpenSSL wiki页面讨论了thread and fork safety,我不确定如何解决一些问题。
有没有办法指定应该在fork
上重新初始化一个库(例如OpenSSL)?
答案 0 :(得分:2)
互斥锁在fork
之间无效,除非您将它们放在共享内存中并初始化设置为PTHREAD_PROCESS_SHARED的pthread_mutexattr_setpshared
的互斥锁属性。
目前尚不清楚你是在分叉,然后创建线程或创建线程然后分叉。如果是后者,则fork只会应用于调用fork的线程。在新进程中没有创建其他线程。
如果你正在分叉然后线程化,那么互斥锁只适用于子进程及其线程,那么只需在fork之后创建它们。