问题标签 [sigpipe]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1176 浏览

ios - 即使忽略 SIGPIPE 信号,IOS 6.0 上的 SIGPIPE 错误

在我的示例应用程序中,即使我在 main.m 文件中忽略了该信号,它也会显示 SIGPIPE 错误

gdb 的回溯是

当我进入待机模式并返回时,会发生此错误。我已经使用 IOS 6.0 在 IPAD 上对其进行了测试。Xcode 版本是 4.5/5.0 。

0 投票
1 回答
905 浏览

c - EPIPE错误不出现?

根据我对 SIGPIPE 的了解,我进行了测试以尝试产生 SIGPIPE 问题。这是服务器和客户端的代码:

服务器代码:

客户端代码:

我设置实验的方式如下。我先启动服务器,然后启动客户端。在客户端打印出消息:“请输入消息:”后,我停止了服务器。然后我尝试在客户端输入一些文本(例如“test”)进行发送。因为我使用signal(SIGPIPE, SIG_IGN)了,我期望的是EPIPE来自客户端的一些错误代码,但我什么也没得到。客户端打印出来:

我错过了什么吗?如何设置写操作的代码以返回EPIPE错误?

0 投票
3 回答
9764 浏览

python - 忽略错误代码 141 的 Bash pipefail

如果在管道的任何步骤中存在非零错误的情况下捕获到非零错误,则设置 bashpipefail选项(通过)允许脚本失败。set -o pipefail

但是,我们遇到了SIGPIPE错误(错误代码 141),其中数据被写入不再存在的管道。

有没有办法将 bash 设置为忽略SIGPIPE错误,或者有没有办法编写一个错误处理程序来处理所有错误状态代码,比如 0 和 141?

例如,在 Python 中,我们可以添加:

将默认行为应用于SIGPIPE错误:忽略它们(参见http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-06/3823.html)。

bash 中是否有一些类似的选项?

0 投票
1 回答
227 浏览

perl - 为什么我的 SIGPIPE 不打印消息?

现在我正试图抓住那个破管子

当我预料到的时候,什么都没有打印出来SIGPIPE。好像它对待我的匿名子处理程序就好像它是一样的IGNORE

  • 几乎所有子内容都不会产生任何效果(打印、模具、更改包变量值)

  • 代码不会死;如果您最终将某些内容打印到 STDOUT,它将打印。

我错过了什么?


更新:@jm666 的回答让我想到了这个问题:管道的写入没有被刷新;因此,现在获得 SIGPIPE 还为时过早。添加自动刷新有助于:

0 投票
2 回答
539 浏览

perl - 是否可以检测到哪个管道抛出了 SIGPIPE?

我正在尝试处理如下工作的服务器:

  • 它有一个父进程
  • 它创建一个“助手”子进程来处理一些特殊任务
    • 它用管道打开子进程;并使用管道向孩子发出命令。
  • 它还衍生出许多其他子进程(服务器的主要目标是执行各种命令)。

我希望能够检测到向子进程的管道写入失败的时间;并发出特别通知。

$SIG{PIPE}通常,我会通过在父进程中创建自定义处理程序来实现这一点。

但是,我关心的是父进程启动以执行命令的某些进程可能有自己的管道对它们开放。如果写入 THOSE 管道失败,我想简单地忽略 SIGPIPE。

Q1。有没有办法让我从 SIGPIPE 处理程序中分辨出哪个打开的管道发出了信号?(我知道每个孩子的 PID,所以 PID 会很好......或者如果有办法通过文件描述符#s 来做到这一点?)。

Q2。我可以使用local $SIG{PIPE}某种方式解决问题吗?我的假设是我需要:

  • local $SIG{PIPE}在写入该管道之前设置 helper-process-specific
  • print $HELPER_PIPE(这只发生在一个子程序中)
  • 将 $SIG{PIPE} 重置为DEFAULTIGNORE
  • 确保这 3 个操作在它们自己的块范围内。
0 投票
0 回答
1181 浏览

c - SIGPIPE 信号处理

我试图弄清楚两个相关进程之间的管道通信是如何工作的,所以我编写了这个简单的 C 程序。

我创建了一个管道,孩子在上面写了一些东西,父母阅读了消息并关闭了读取侧管道。到目前为止,它工作得很好,但是当我尝试发送第二条消息时,管道在读取端关闭,它应该引发一个由我的 sigpipe_h 函数处理的 SIGPIPE 信号,不是吗?为什么没有发生?我哪里错了?

谢谢您的帮助。

0 投票
2 回答
1118 浏览

c - 写入关闭的套接字没有按预期引发 SIGPIPE

我已经阅读了如何预防SIGPIPE,然后我编写了一个小程序来测试它。这是代码。

服务器.c

客户端.c

当我在同一台linux机器上运行服务器和客户端时,在服务器端,第一个write()返回写入的字节数,而我期待一个SIGPIPE信号,因为我关闭了客户端的套接字,第二个write()确实生成了一个SIGPIPE信号。
但是当我在另一台 linux 机器或 Windows 机器上运行客户端时(使用 Winsock 实现相同的客户端),我没有捕捉到任何SIGPIPE信号,第二个write()仍然返回buffer. 有人可以告诉我发生了什么事吗?

0 投票
1 回答
399 浏览

gdb - Eclipse CDT:线程在调试模式下获取 SIGPIPE

有一个用 C 语言编写的工具,基于套接字编程和多线程。如果我只是简单地运行该工具,则不会出现错误,并且该工具可以完美地工作。

但是,如果我在调试模式下运行该工具,线程之间的切换会引发 SIGPIPE 信号,因此数据无法从该工具传输到其服务器。

使用 SIGNAL(SIGPIPE, SIG_IGN) 处理 SIGPIPE 会使线程工作吗?

据我了解,这是由于线程之间的进程间通信失败而引起的。如果是,那么如何调试这样的多线程应用程序?

请建议我处理此问题的方法。

0 投票
0 回答
1368 浏览

c - 当客户端在C中关闭连接时如何向服务器发送信号

我想使用 c 创建单边聊天应用程序,当阅读器(客户端)按 Ctrl+c 时,应该关闭编写器(服务器)。但问题是我仍然不知道如何在阅读器按 Ctrl+c 时向编写器发送信号。

请对此提出任何建议...

这是读者端代码:

这是作者端代码:

0 投票
1 回答
2586 浏览

linux - 尝试在没有阅读器的情况下编写时陷阱 SIGPIPE

我正在尝试在 Bash 中的两个进程之间实现命名管道通信解决方案。

第一个进程向命名管道写入一些内容:

第二个脚本应该像这样读取命名管道:

请注意,之前已使用传统命令创建了命名管道

我的问题是阅读器脚本并不总是在运行,因此如果编写器脚本尝试写入命名管道,它将一直处于阻塞状态,直到阅读器连接到管道。

我想避免这种行为,解决方案是捕获 SIGPIPE 信号。事实上,根据 man 7,当尝试在没有阅读器的管道中写入时,应该发送信号。所以我改变了我的红色功能:

但是当我运行阅读器脚本时,脚本会被阻止,并且不会打印“SIGPIPE received”。

我是在信号机制上弄错了,还是有更好的解决方案来解决我的问题?