C 检测 popen 子进程中的错误

2024-04-11

我在用着popen读取第三方程序的输出。如果子程序失败,我想检测并重新启动。

我该怎么做呢?如果子进程死亡,进程不会正常退出,因此无法使用WEXITSTATUS去检查。

还有别的办法吗?

这是一个简单的例子:

PINGER.C

#include <string.h>
#include <stdio.h>
#include <unistd.h>

int
main(int argc, char **argv)
{
    int i = 0;
    while (1)
    {
        //fprintf(stderr, "StdErr %d\n", i);
        printf("stdout %d\n", i++);
        fflush(stdout);

        if (i == 5)
            i = i / 0; // Die a horrible death

        sleep(1);
    }
}

观察者C

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>

int
main(int argc, char **argv)
{
    char *cmd = "./pinger";
    printf("Running '%s'\n", cmd);

    FILE *fp = popen(cmd, "r");
    if (!fp)
    {
        perror("popen failed:");
        exit(1);
    }

    char inLine[1024];
    int  bytesRead = 0;
    int  i = 0;

    while (fgets(inLine, sizeof(inLine), fp) != NULL)
    {
        int len = strlen(inLine);
        if (inLine[len-1] == '\n')
            inLine[len-1] = '\0';

        printf("Received: '%s'\n", inLine);
    }

    printf("feof=%d ferror=%d: %s\n", feof(fp), ferror(fp), strerror(errno));

    int rc = pclose(fp);
    printf("pclose returned: %d. IFEXITED=%d\n", rc, WIFEXITED(rc));
}

这是输出:

$ ./popenTest
calling popen
Running './pinger'
pipe open
Received: 'stdout 0'
Received: 'stdout 1'
Received: 'stdout 2'
Received: 'stdout 3'
Received: 'stdout 4'
feof=1 ferror=0: Success
pclose returned: 8. IFEXITED=0 EXITSTATUS=0

(根据这篇文章 https://www.ibm.com/support/knowledgecenter/en/SSB23S_1.1.0.15/gtpc2/cpp_wexitstatus.html,你实际上不能使用WEXITSTATUS如果命令没有正常退出,但我还是尝试了)


阅读 POSIX 规范pclose() http://pubs.opengroup.org/onlinepubs/9699919799/functions/pclose.html (and popen() http://pubs.opengroup.org/onlinepubs/9699919799/functions/popen.html也)。它说:

返回值

成功返回后,pclose()应返回命令语言解释器的终止状态。否则,pclose()应返回-1并设置errno以指示错误。

因此,您可以通过返回值间接获取进程的退出状态pclose()。这将是 0 到 255 之间的数字。Shell 通常通过返回该值来报告“通过信号发出的孩子死亡”128 + signal_number。该规范概述了状态可能不可用的情况(您的程序称为wait()并获取了打开的进程的信息popen()在你打电话之前pclose(), 例如)。阅读规范popen()解释了规范中“命令语言解释器”的使用pclose().

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

C 检测 popen 子进程中的错误 的相关文章

随机推荐

  • 当 iPhone 进入睡眠状态时,AVAudioPlayer 停止播放音频

    只要我的应用程序正在运行 我就需要一直播放背景声音 我尝试使用 AVAudioPlayer 来实现此目的 然而 一旦 iPhone 进入睡眠模式 它就会停止播放声音 你能让我知道如何解决这个问题吗 Thanks 您可能需要设置音频会话类别
  • 滚动所有嵌套滚动条以将 HTML 元素带入视图

    我无法理解它 该元素存在于多个可滚动 DIV 元素的嵌套层次结构中 而不是存在于单个可滚动文档窗口中 我头疼的问题之一是如何scrolled offsetParent is document body 颜色papayawhip在下面的测试代
  • 如何在 MATLAB 中保存高分辨率图形

    当我从 MATALB 保存图形时 我希望生成的图像具有非常高分辨率 以便我可以放大以查看图像中的细节 当我在图形上使用 文件 gt 另存为 时 图像的分辨率不高 如何在 MATLAB 中将图形保存为高分辨率图像 您可以从命令行或 文件 菜单
  • vbCrLF 或环境.NewLine

    我使用Environment NewLine 我的同事使用vbCrLf 当我为他们进行代码审查时 我想要一些我可以指出的东西来说明 使用Environment NewLine而不是vbCrLf 或者 我只是在风中撒尿 这并不重要吗 Envi
  • pygame.display.update() 错误:视频系统未初始化

    import pygame from pygame locals import def main global FPSCLOCK DISPLAYSURF BASICFONT PLAY SURF PLAY RECT NEW SURF NEW
  • 什么是“PHP 标准化”版本号字符串?

    我搜索了一个描述 PHP标准化 版本号字符串的网络资源 但我没有找到 有吗 我想知道如何编写有效的 PHP 标准化 版本 PHP standardized number format与描述页面相关的是语义版本控制 http semver o
  • BackgroundWorker 完成事件 - 哪个线程?

    BackgroundWorker 控件的已完成事件是否返回到 GUI 线程 或者我是否必须将其封送回来 另外 进度事件是否返回到 GUI 线程 或者我是否必须将其封送回来 这两个事件都将被编组到 UI 线程上
  • Rails - 具有 data-* 属性的 link_to 帮助器 [重复]

    这个问题在这里已经有答案了 可能的重复 将 html5 数据属性与 Rails content tag 帮助器一起使用的最佳方法 https stackoverflow com questions 4258512 best way to u
  • 使用 Spring Data JDBC 的嵌套数据结构

    我想创建一个嵌套的数据结构 Entity1包含类型的对象Entity2存储在地图中 Entity2应该包含一个对象的映射Entity3 第一部分 Entity1 and Entity工作正常 当我添加Entity3 发生异常 当我执行一个简
  • 如何在 php/mysql Web 应用程序中实现悲观锁定?

    如何在 php mysql Web 应用程序中实现悲观锁定 网络用户打开一个页面来编辑一个数据集 行 网络用户单击 锁定 按钮 因此其他用户可以读取但不能写入此数据集 网络用户进行一些修改 可能需要 1 到 30 分钟 网络用户单击 保存
  • 如何在 watir 的 webdriver-user-agent gem 中传递 Chrome 选项

    我正在尝试使用 Watir gem 传递 Chrome Drive 的 cookies 选项 从 Watir 文档我可以做Watir Browser new chrome opts 所以对于cookie我可以这样做 browser Wati
  • Android FAB setBackgroundTintList 与 ColorStateList 不起作用

    我想在未启用 NFC 时更改 NFC 扫描 FAB 的颜色 我已成功在应用程序启动时更改颜色 但如果用户点击 FAB 并启用 NFC 颜色不会更改为原色 日志显示确实如此 但更改并未发生 My minSdkVersion 15 XML
  • Node.js 请求库的相对 uri

    我有以下代码 node js 无法解析 url const request require request const teamURL users user id teams const req request url teamURL js
  • 类“QueryParameterComparer”必须实现函数比较。

    我在下面从 C 转换为 VB NET 的代码中遇到以下错误 原始代码可以在此处找到 https developer linkedin com sites default files LinkedInAuth rar zip https de
  • 带有 android:priority 设置的意图过滤器

    我测试了意图过滤器android priority 0 和意图过滤器android priority 20 by android intent category HOME 我列出以下信息
  • 变量中的 JavaScript 反斜杠 (\) 导致错误

    在 Javascript 中 当我在某些变量中添加反斜杠时 例如 var ttt aa var ttt aa JavaScript 显示错误 如果我尝试限制用户输入此字符 我也会收到错误 aaa indexOf 1 限制用户输入中的反斜杠并
  • 如何更改 Xamarin 中的章节标题字体样式?

    我有这个列表视图 但我不知道如何设置部分标题的样式 在 Xamarin 中如何实现 还没有找到任何东西
  • OpenCV 中是否可以将局部曲率绘制为代表对象“指向性”的热图?

    给定一个可以检测并绘制轮廓的斑点阈值图像 在绘制轮廓时是否可以将局部曲率表示为热图 即是否 1 可以确定开放 cv 轮廓上的局部曲率 2 将此曲率映射到热图颜色空间 3 将轮廓绘制为热图 我的目标是测量对象的 尖度 以便我可以绘制从尖头侧到
  • 带回滚的Mysql嵌套事务

    有人可以告诉我是否可以从一个过程中调用另一个过程 并且如果任一过程的任何部分失败 则回滚所有内容 如果这是可能的 有人可以向我展示一个如何实施的小例子吗 EDIT 过程 b 失败 但过程 a 仍然向表 a 中插入一行 据我了解 如果插入的任
  • C 检测 popen 子进程中的错误

    我在用着popen读取第三方程序的输出 如果子程序失败 我想检测并重新启动 我该怎么做呢 如果子进程死亡 进程不会正常退出 因此无法使用WEXITSTATUS去检查 还有别的办法吗 这是一个简单的例子 PINGER C include