【问题标题】:Multithreaded program and fork(): alternative or safe implementation多线程程序和 fork():替代或安全实现
【发布时间】:2016-12-17 21:38:57
【问题描述】:

在多线程 Linux/C++ 程序中,我想将fork()SIGCHLD 的信号处理程序一起使用。

在子进程中我使用open()创建两个新的文件描述符sendfile()close(),然后子进程退出。

我打算使用fork()来实现以下需求:

父进程中的线程应该能够

  1. 检测子进程的正常终止,在这种情况下应该能够为一系列文件创建另一个fork() 执行open()/sendfile()/close()
  2. 在发生特定事件的情况下杀死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() for cp / rsync。正如我所看到的,后台线程将调用system( "rsync..."),并且必须等到它返回。

标签: c++ linux multithreading


【解决方案1】:

您可以使用线程,但强行终止线程通常会导致内存泄漏和其他问题。

我的 linux 经验有些有限,但我可能会尝试尽早 fork 程序,在它获得多线程之前。现在您有了两个实例,可以安全地使用单线程实例来管理其他实例的启动和停止。

【讨论】:

  • 如果在开发开始时考虑,这可能是一个解决方案,但不幸的是它极大地影响了我的 SW 设计。
  • 我认为您将不得不进一步解释为什么会这样。您知道您可以使用共享内存和类似的方式进行进程间通信吗?分叉的实例需要拥有完成其任务所需的数据。除了数据,您还需要其他资源吗?
  • 一个问题是“传输线程”接收到一个指向类实例的指针以报告错误。 log 函数也被其实例在主线程中运行的其他类使用。这基本上可以通过 IPC 解决,就像线程的其余配置一样。我希望找到一个更简单的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多