【发布时间】:2016-12-17 21:38:57
【问题描述】:
在多线程 Linux/C++ 程序中,我想将fork() 与SIGCHLD 的信号处理程序一起使用。
在子进程中我使用open()创建两个新的文件描述符sendfile()和close(),然后子进程退出。
我打算使用fork()来实现以下需求:
父进程中的线程应该能够
- 检测子进程的正常终止,在这种情况下应该能够为一系列文件创建另一个
fork()执行open()/sendfile()/close() - 在发生特定事件的情况下杀死
sendfile()-child 进程并检测到有意终止进行清理
对于要求 1,我可以等待sendfile() 的结果。
要求 2 是我认为首先需要使用 fork() 的原因。
看完下面的帖子
我认为我的解决方案可能不是一个好的解决方案。
我的问题是:
- 是否有其他解决方案来实现要求 2?
- 或者我怎样才能确保库调用
open(), close() and sendfile()会正常?
更新:
- 程序将在 Busybox Linux / ARM 上运行
- 我认为我应该使用
sendfile()来获得最有效的文件传输,因为我已经阅读了几篇关于此主题的帖子。 实现我的要求的安全方法是使用fork()和exec*()和cp,缺点是文件传输效率可能较低
更新 2:
-
fork()在特定事件的情况下(而不是每个文件一次)就足够了,因为我在子进程中使用rsync切换到exec*()。但是,在发生特定事件时,程序需要始终调用rsync。
【问题讨论】:
-
或者只是在后台线程上使用读/写而不是 fork。
-
从多线程程序分叉通常具有未定义的行为。更具体地说,分叉的孩子处于异步信号上下文中,其中唯一允许的操作是(基本上)退出或执行。你可以非常明确地不做的是内存分配之类的事情。
-
@RichardCritten:我不知道有什么方法可以告诉 bg 线程在等待
sendfile()返回时停止,而且我不想等待以防万一文件很大处理完毕 -
@radix 这就是读/写的原因
-
你能详细说明一下吗?读/写是什么意思?我不明白如何中止在后台线程中启动的
sendfile()或system()forcp/rsync。正如我所看到的,后台线程将调用system( "rsync..."),并且必须等到它返回。
标签: c++ linux multithreading