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 相当于超时吗? 的相关文章

  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • “./somescript.sh”和“. ./somescript.sh”有什么区别

    今天我按照一些说明在 Linux 中安装软件 有一个需要首先运行的脚本 它设置一些环境变量 指令告诉我执行 setup sh 但是我执行时犯了一个错误 setup sh 所以环境没有设置 最后我注意到了这一点并继续进行 我想知道这两种调用脚
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • 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