Operating system 如何对继承所有父线程的进程进行守护?

Operating system 如何对继承所有父线程的进程进行守护?,operating-system,pthreads,fork,daemon,Operating System,Pthreads,Fork,Daemon,我有一个创建多个线程和一个套接字的进程。 现在我想通过调用fork并退出父进程来创建一个守护进程。 但父进程创建的线程在父进程被终止时退出。 有没有一种方法可以将这些线程和套接字继承到子进程? 代码在CPP中运行 但父进程创建的线程在父进程被终止时退出 不完全是。父线程不受影响,子线程只获得名为fork的线程。这与子线程获取其他线程并随后终止这些线程不同。特别是,在子级中不会调用可能已由它们注册的取消处理程序或退出处理程序,这可能会使互斥锁和其他同步对象处于不可用和不可恢复的状态。清理这样一堆乱

我有一个创建多个线程和一个套接字的进程。 现在我想通过调用fork并退出父进程来创建一个守护进程。 但父进程创建的线程在父进程被终止时退出。 有没有一种方法可以将这些线程和套接字继承到子进程? 代码在CPP中运行

但父进程创建的线程在父进程被终止时退出

不完全是。父线程不受影响,子线程只获得名为fork的线程。这与子线程获取其他线程并随后终止这些线程不同。特别是,在子级中不会调用可能已由它们注册的取消处理程序或退出处理程序,这可能会使互斥锁和其他同步对象处于不可用和不可恢复的状态。清理这样一堆乱七八糟的东西是叉式搬运器的预期目的,但正确使用这些东西很难,而且必须在整个过程中始终如一地使用它们才能有效

我有没有一种方法可以继承这些线程和socker到子进程

子进程自动继承其父进程的打开文件描述符,因此无需对套接字执行任何特殊操作。但是其他线程呢?没有

所有这些都是明确的:

新流程子流程应为调用流程的精确副本 处理父进程,以下详细说明除外:

[……]

子进程应有其自己的父进程文件描述符副本。每个孩子的文件描述符应参考 与的相应文件描述符相同的打开文件描述 父母。 [……]

应使用单个线程创建进程。如果多线程进程调用fork,则新进程应包含 调用线程及其整个地址空间的副本,可能是 包括互斥体和其他资源的状态。因此 为了避免错误,子进程只能执行异步信号安全 直到调用某个exec函数为止的操作

当应用程序从信号处理程序调用fork,并且pthread_atfork注册的任何fork处理程序调用 不是异步信号安全的,行为未定义

如果分叉的目标是与原始会话和父会话解除关联,以便作为守护进程在后台运行,那么最好的选择是初始线程在启动时立即执行此操作,然后再创建任何附加线程或打开任何套接字