使用信号和 sigpipe

2023-12-02

我正在做一项作业,涉及编写一个程序来使用 fork(进程)、信号和选择来处理数据(计算 pi)。

我现在正在处理信号,我想我想做的是使用 SIGPIPE,因此如果程序捕获它,它会尝试再次写入管道(如果进程尝试写入没有读取器的管道) ,将会发送 SIGPIPE)。

我在 main() 中使用 fork() 通过将每个进程发送到工作函数来为每个进程分配相同的工作。

void worker(int id) {
    .... (this piece of code is not relevant)

    if(write(pfd[id][1], &c, sizeof(c)) == -1)
        printf("Error occurred: %s\n",strerror(errno));

}

如何在此函数中实现信号以捕获 SIGPIPE 并使其再次写入管道?

谢谢你!


通常,而不是捕获SIGPIPE有人忽视它,这会导致write失败EPIPE而不是默默地终止你的程序。

However:如果您得到的是SIGPIPE当您写入管道时,请不要重试。它永远不会起作用。SIGPIPE意味着管道没有读取器——如果管道现在没有读取器,它将永远不会有读取器。 (这样想:没有读卡器的管道怎么能得到一个读卡器?这是不可能的!)

你的问题是你正在关闭管道的另一端。解决这个问题,不用担心SIGPIPE. SIGPIPE只是症状。

Edit:这里有两个问题需要回答。如果你无法回答both这些问题,那就不用费心去处理SIGPIPE.

  1. 什么会导致我的程序收到SIGPIPE?唯一的接收方式SIGPIPE用于关闭管道的读取端。如果读取进程崩溃,或者被编程为关闭管道,就会发生这种情况。如果您正在编写网络服务器,或与未知进程通信,这可能很常见。但是,如果您编写的两个程序都在本地运行,则可能表示存在编程错误。

  2. 当我的程序捕获时会做什么SIGPIPE?如果您正在编写一个使用管道与服务器通信的客户端进程,那么您应该做什么SIGPIPE?您无法重试,并且客户端通常无法重新启动它们所连接的服务器。只需做明智的、默认的事情,然后让SIGPIPE终止你的程序。但是,如果服务器正在向客户端发送数据,它会控制并获取SIGPIPE, it could重新启动客户端。但这可能是一个非常糟糕的主意——例如,如果客户端是确定性的,它就会再次崩溃,最终会陷入无限循环而不是简单的崩溃。

所以这里的一般格言是“只捕获您准备处理的错误。“ 不要仅仅为了完整性而捕获错误。只要让它们使你的程序崩溃,或者导致操作失败,然后你就可以回去调试它。

代码片段:这是我的一个项目中的一段代码。如果你运行它,SIGPIPE不会终止你的进程。反而,write将生成一个EPIPE错误。如果你正在编写一个网络服务器,那么EPIPE是客户端突然断开连接的一种可能方式。

void
ignore_sigpipe(void)
{
    struct sigaction act;
    int r;
    memset(&act, 0, sizeof(act));
    act.sa_handler = SIG_IGN;
    act.sa_flags = SA_RESTART;
    r = sigaction(SIGPIPE, &act, NULL);
    if (r)
        err(1, "sigaction");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用信号和 sigpipe 的相关文章

随机推荐

  • 如何在matplotlib上生成一系列直方图?

    我想生成一系列直方图 如下所示 上面的可视化是在张量流中完成的 但我想在 matplotlib 上重现相同的可视化 编辑 使用 SpghttCd建议的plt fill Between 我有以下代码 colors cm OrRd r np l
  • 如何通过 jQuery 将文件发送到 php?

    我尝试通过 jQuery 将文件发送到 PHP 文件进行处理
  • php preg_replace - 保留指定字符+外语字母[重复]

    这个问题在这里已经有答案了 我需要一个从字符串中删除所有字符 未在模式中列出 但保留外语字母 的函数 我知道 preg replace 有 p 模式 但由于某种原因我无法让它工作 我使用这个函数来删除字符串中的所有垃圾 main conte
  • 动态图片绑定vue

    我想做与这里相同的事情 但我想使用 images sample 作为参数 例如props images sample
  • Schema.org:使用什么,微数据还是 JSON-LD?

    数据标记Schema org对于 Google Yahoo Bing 和 Yandex 等搜索网站来说 片段非常适合 然而 我认为大多数网站管理员都使用微数据 但几乎从不使用JSON LD 最近了解了JSON LD 有一些疑惑 我可以在没有
  • SQL:如何按两列的唯一组合进行分组?

    Context A table message有列from user id and to user id 用户应该看到最近的对话以及显示的最后一条消息 一个对话由多条消息组成 这些消息具有相同的用户 ID 组合 用户发送消息 用户接收消息
  • Python 相当于 MATLAB 的“ismember”函数

    经过多次尝试优化代码后 最后一个资源似乎是尝试使用多个内核运行下面的代码 我不确切知道如何转换 重新构造我的代码 以便它可以使用多个内核运行得更快 如果我能获得实现最终目标的指导 我将不胜感激 最终目标是能够针对数组 A 和 B 尽可能快地
  • 在 JavaScript 中用正则表达式替换字符串

    一个特定的正则表达式现在困扰着我 我只是想更换范围 100像这样的字符串 var string commonstringblabla b range 100 b stringandsoon with commonstringblabla b
  • Git 预提交挂钩

    我是 git hooks 的新手 我无法理解下面的预提交挂钩 谁能告诉我这是如何工作的 这里我怀疑 grep 将如何在提交的文件中发生 因为我们不会将这些文件带到任何地方 抱歉 如果我问错了问题 但请帮助我理解 git hooks usr
  • 外部服务的 Kubernetes 入口规则

    这个问题类似于question但这更多的是围绕可以配置的规则中的路径 入口应该能够处理内部服务和外部服务 外部服务的 URL 应该类似于http 主机名 80 es 当用户点击此 url 时 应将其重定向到外部服务 服务定义和入口规则配置如
  • 在android中从sdcard中删除文件

    我正在制作一个应用程序 其中我必须删除 SD 卡中最近添加的 mp3 文件 歌曲保存的格式为 Songhello 17 26 amr where 17 26是添加歌曲的时间 谁能帮我如何删除SD卡中最近添加的文件 我的意思是说我想删除时间意
  • 如何在涉及链接的 Access 中连接多行?

    我的 Access 数据库存在以下问题 我有 3 个表 分别是 tblComponents tblErrors 和 linkComponentsErrors 这是一种多对多关系 这意味着一个组件可以有多个错误 而一个错误可以有多个组件 这些
  • 数字文字末尾的 F 和 D 是什么意思?

    我见过一些这样的符号 但我找不到任何奇怪的地方 double d 5D float f 3 0F 5后面的D和F到底是什么意思 意味着这些数字分别是双精度数和浮点数 假设你有 void foo int x void foo float x
  • 如何重新排列 PDF 文件的页面顺序?

    我最后正在生成目录 我想将目录移动到开头 假设我的 PDF 有 16 页 目录从第 13 页开始到第 15 页结束 我想将目录移至第二页 这样第一页仍为第 1 页 最后一页仍为第 16 页 这段代码没有给我我想要的 public void
  • 如何从 aframe 中的 3D 对象获取边界框信息?

    我正在开发一个 aframe 项目 该项目涉及将未知大小的 3D 对象加载到我的场景中 当然 在将对象放入场景之前 我希望将其大小调整到一定的大小 例如固定高度 但是如何从对象的边界框中提取宽度 高度和深度等信息呢 您需要在此处使用 A F
  • 我如何在原型工作中得到“this = this”

    好吧 偷看 所以我知道弄乱原型是不好的做法 但无论如何 Array prototype rev function this reverse 工作正常 更新源数组变量 ary 如预期 例如 ary 123 456 ary rev result
  • 在 ggplot2 中用梯度和变化的图例特征标记线条

    我正在使用以下数据查看 1954 年至 2000 年每月最高气温的变化 http pastebin com 37zUkaA4 为了清楚起见 我决定只在图表上绘制每个月的 abline 我的代码如下 OxTemp Month lt facto
  • 如何删除 sed 中第一个模式后面的空格

    我有一个文件 file txt Name 6 1 4 Float Time 453802 464204 466345 464481 466131 464283 465065 462561 Name 6 1 4 Logic Good Time
  • 在 Outlook 中触发外部 API 调用,回复来自特定电子邮件 ID 的电子邮件

    当我回复来自特定发件人的电子邮件时 我尝试触发外部 API 为了描述用例 我们有一个内部平台 人们可以在其中提出具体问题 专家会回答这些问题 类似于堆栈溢出 我们希望为专家回答问题启用 Outlook 功能 这将使专家能够回复电子邮件通知
  • 使用信号和 sigpipe

    我正在做一项作业 涉及编写一个程序来使用 fork 进程 信号和选择来处理数据 计算 pi 我现在正在处理信号 我想我想做的是使用 SIGPIPE 因此如果程序捕获它 它会尝试再次写入管道 如果进程尝试写入没有读取器的管道 将会发送 SIG