Waitpid 相当于超时吗?

2023-12-06

想象一下我有一个启动多个子进程的进程。父母需要知道孩子何时退出。

我可以用waitpid,但是如果/当父级需要退出时,我无法告诉被阻塞的线程waitpid优雅地退出并加入它。让事情自行清理固然很好,但这可能没什么大不了的。

我可以用waitpid with WNOHANG,然后休眠一段任意时间以防止忙等待。然而,我只能知道孩子是否经常出去。就我而言,我知道孩子何时立即退出可能不是非常重要,但我想尽快知道......

我可以使用信号处理程序SIGCHLD,并在信号处理程序中执行当子进程退出时我要做的任何事情,或者向不同的线程发送消息以执行某些操作。但是使用信号处理程序会稍微混淆代码流程。

我真正想做的是使用waitpid超时时,比如 5 秒。由于退出进程不是一个时间关键的操作,我可以懒洋洋地向线程发出退出信号,同时仍然阻止它waitpid其余时间,随时准备做出反应。linux中有这样的调用吗?在众多替代方案中,哪一个最好?


EDIT:

另一种基于回复的方法是阻止SIGCHLD在所有线程中pthread \ _sigmask()。然后在一个线程中,继续调用sigtimedwait()在寻找的同时SIGCHLD。这意味着我可以在该调用上超时并检查线程是否应该退出,如果不应该退出,则保持阻塞状态等待信号。一旦SIGCHLD传递到该线程后,我们可以立即对其做出反应,并且与等待线程一致,而无需使用信号处理程序。


不要混合alarm() with wait()。这样您可能会丢失错误信息。

使用自管技巧。这将任何信号变成select()能够事件:

int selfpipe[2];
void selfpipe_sigh(int n)
{
    int save_errno = errno;
    (void)write(selfpipe[1], "",1);
    errno = save_errno;
}
void selfpipe_setup(void)
{
    static struct sigaction act;
    if (pipe(selfpipe) == -1) { abort(); }

    fcntl(selfpipe[0],F_SETFL,fcntl(selfpipe[0],F_GETFL)|O_NONBLOCK);
    fcntl(selfpipe[1],F_SETFL,fcntl(selfpipe[1],F_GETFL)|O_NONBLOCK);
    memset(&act, 0, sizeof(act));
    act.sa_handler = selfpipe_sigh;
    sigaction(SIGCHLD, &act, NULL);
}

然后,类似 waitpid 的函数如下所示:

int selfpipe_waitpid(void)
{
    static char dummy[4096];
    fd_set rfds;
    struct timeval tv;
    int died = 0, st;

    tv.tv_sec = 5;
    tv.tv_usec = 0;
    FD_ZERO(&rfds);
    FD_SET(selfpipe[0], &rfds);
    if (select(selfpipe[0]+1, &rfds, NULL, NULL, &tv) > 0) {
       while (read(selfpipe[0],dummy,sizeof(dummy)) > 0);
       while (waitpid(-1, &st, WNOHANG) != -1) died++;
    }
    return died;
}

你可以看到在selfpipe_waitpid()如何控制超时甚至与其他混合select()基于IO。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Waitpid 相当于超时吗? 的相关文章

随机推荐

  • JSP 如何缩放图像?

    有没有办法缩放图像然后在jsp页面中显示 当检索和显示图像时 我想以相同的尺寸显示所有照片 有什么API可以做到吗 我从谷歌搜索过 我发现那些是关于使用 Takeit 缩放图像的 但不能在网络应用程序中工作 您可以使用内置的Java 2D
  • 链接GLEW和其他,_glViewport是唯一未解决的

    我正在使用 G 将我的项目链接到 glew32 glfw opengl32 glu32 等 一切都编译得很好 但是在链接阶段 除了 glViewport 之外的所有内容都链接 我收到此错误 对 glViewport 的未定义引用 我觉得这
  • 如何在流数据集中加载 tar.gz 文件?

    我想从 tar gzip 文件 tgz 进行流式处理 其中包括我实际的 CSV 存储数据 当我的数据以 CSV 文件形式出现时 我已经成功地使用 Spark 2 2 进行结构化流处理 但实际上 数据以 gzipped csv 文件形式出现
  • MySQL GROUP BY 优先

    是否可以使用 GROUP BY 并优先选择记录 例如 我有一大堆联系人数据 可能包含也可能不包含所有信息 在 CSV 意义上 如果可能如下所示 Test User Address1 Address2 email protected emai
  • QML 虚拟键盘隐藏按钮不起作用

    如果我点击键盘 我会遇到问题hide按钮 以下是代码 import QtQuick 2 6 import QtQuick Window 2 2 import QtQuick Controls 2 2 import QtQuick Virtu
  • jQuery 限制显示的元素数量,例如 5

    我可以这么说 ol li Content1 li li Content2 li li Content3 li li Content4 li li Content5 li li Content6 li li Content7 li li Co
  • Matlab 用随机元素生成矩阵

    如何生成一个带有布尔元素的矩阵 但每行的总和等于某个常数 每一行都有相同的数字吗 k 5 m 10 n 10 I sort rand m n 2 M I lt k 如果您不想要相同数量的1每行都有一个 s 而是有一个向量指定每行有多少个1如
  • 麻木。将一个数组中的所有向量行与同一数组中的所有其他向量行进行比较

    我有一个 numpy 数组 如下所示 a array 2 3 0 2 并希望使用 np greater 将每行中的 向量 与其他行进行比较 因此 array False False lt 2 3 compared with 2 3 True
  • 了解 Dean Edwards 的 addevent JavaScript

    我需要帮助理解这段代码 重点是什么handler guid 为什么需要哈希表 重点是什么 if element on type handlers 0 element on type 文中的 这个 指的是什么handleEvent 元素还是a
  • 在 PHP 中分割文本文件

    如何使用 PHP 按字符数将大型文本文件拆分为单独的文件 因此 一个 10 000 个字符的文件每 1000 个字符就会被拆分为 10 个文件 此外 只有在找到句号后才可以拆分吗 Thanks 更新 1 我喜欢 zombats 代码 我删除
  • 单元测试适配器抛出异常:不支持 URI 格式

    在 Visual Studio 2010 中 当我使用以下基本代码创建默认测试项目时
  • 让 PowerShell 等待 Excel 完成刷新数据透视表

    所以我开发了一个Powershell脚本来刷新大约40个大的excel文件并保存它们 在这个脚本中我运行一个excel宏来传递excel ODBC 连接参数 然后在刷新完成后从excel文件中删除它们 我唯一的问题是 对于这 40 个文件中
  • qmake 和多个 MSVS 版本

    From Visual Studio 2008 Command Prompt我运行这个命令来生成 vcproj file gt qmake spec win32 msvc2008 并收到警告消息 WARNING Generator MSVC
  • LINQ连接多表

    我有4张桌子 table1 id1 fk tbl2 this is the foreign key to the id in table2 table2 id2 fk tbl3 this is the foreign key to the
  • 如何让gganimate中的点出现而不是过渡

    我正在使用 gganimate 假设我有这个 MWE library ggplot2 library gganimate ggplot airquality aes Day Temp geom point color red size 1
  • 有没有办法以编程方式检测用户何时在浏览器中按下 F5 按钮?

    我有一个缓存 每当用户在浏览器中发出 F5 请求时 我都希望该缓存失效 我正在运行 JSF 2 0 应用程序 有没有办法做到这一点 Use the FacesContext getCurrentInstance isPostBack 检查页
  • 解析 YAML 文件

    这是我第一次使用 YAML 文件 所以我首先想到的是找到任何可以帮助我解析文件的库 我找到了两个库 YamlBean 和 SnakeYAML 我不确定我要使用哪一个 这是我尝试解析的文件的示例 users user1 groups Prem
  • AppEngine Memcache 过期策略

    我期待以下 AppEngine 代码 MemcacheService memcache MemcacheServiceFactory getMemcacheService memcache put Foo Bar Expiration on
  • PHP中删除一行记录

    我试图删除数据库中的一条记录 所以基本上我创建了一个包含我所有记录的表 现在我需要做的是 当我单击 删除 链接时 它将删除记录选定的行 它看起来是这样的 所以基本上我这里有 3 页 1 页面 php2 添加 php3 删除 php 这是我的
  • Waitpid 相当于超时吗?

    想象一下我有一个启动多个子进程的进程 父母需要知道孩子何时退出 我可以用waitpid 但是如果 当父级需要退出时 我无法告诉被阻塞的线程waitpid优雅地退出并加入它 让事情自行清理固然很好 但这可能没什么大不了的 我可以用waitpi