程序接收到信号SIGPIPE,管道损坏

2024-02-01

我写了一个基于posix套接字的客户端程序。该程序创建多个线程并且将锁定服务器。但是在 gdb 调试期间,程序给出了一个信息(错误)

(gdb) n
Program received signal SIGPIPE, Broken pipe. [Switching to Thread 0xb74c0b40 (LWP 4864)] 0xb7fdd424 in __kernel_vsyscall () 
(gdb) 

这是代码:

#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>

int get_hostname_by_ip(char* h , char* ip)
{
    struct hostent *he;
    struct in_addr **addr_list;
    int i;

    if ((he = gethostbyname(h)) == NULL) 
    {
        perror("gethostbyname");
        return 1;
    }
    addr_list = (struct in_addr **) he->h_addr_list;
    for(i = 0; addr_list[i] != NULL; i++) 
    {
        strcpy(ip , inet_ntoa(*addr_list[i]) );
        return 0;
    }

    return 1;
}

void client(char* h, int s)
{
    int fd;
    struct sockaddr_in addr;
    char ch[]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    fd = socket(AF_INET, SOCK_STREAM, 0);
    addr.sin_family=AF_INET;
    char* ip = new char[20];
    get_hostname_by_ip(h, ip);
    addr.sin_addr.s_addr=inet_addr(ip);
    int port = 80;
    addr.sin_port=htons(port);
    if(connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) 
    {
        perror("connect error");
        return;
    }
    while(1)
    {
        if(send(fd, ch, sizeof(ch), 0) < 0)
        {   
            perror("send");
        }
    }
    //char buffer[1024];
    //if(recv(fd, &buffer, sizeof(buffer), 0) < 0)
    //{ 
    //  perror("recive");
    //}

    //printf("nReply from Server: %s\n", buffer);
    close(fd);
}

struct info
{
    char* h;
    int c;
};


void* thread_entry_point(void* i)
{
    info* in = (info*)i;
    client(in->h, in->c);
}

int main(int argc, char** argv)
{
    int s = atoi(argv[2]);
    pthread_t t[s];
    info in = {argv[1], s};
    for(int i = 0; i < s; ++i)
    {
        pthread_create(&t[i], NULL, thread_entry_point, (void*)&in);
    }
    pthread_join(t[0], NULL);

    return 0;
}

它是什么以及做什么?


该过程收到了SIGPIPE。该信号的默认行为是结束进程。

A SIGPIPE如果进程尝试写入已关闭以进行写入或未连接(不再)的套接字,则会发送到该进程。

为了避免程序在这种情况下结束,您可以

  • 让进程忽略SIGPIPE

    #include <signal.h>
    
    int main(void)
    {
      sigaction(SIGPIPE, &(struct sigaction){SIG_IGN}, NULL);
    
      ...
    

    or

  • 安装显式处理程序SIGPIPE(通常什么都不做):

    #include <signal.h>
    
    void sigpipe_handler(int unused)
    {
    }
    
    int main(void)
    {
      sigaction(SIGPIPE, &(struct sigaction){sigpipe_handler}, NULL);
    
      ...
    

在这两种情况下send*()/write()会回来-1并设置errno to EPIPE.

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

程序接收到信号SIGPIPE,管道损坏 的相关文章

  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 以编程方式检查页面是否需要基于 web.config 设置进行身份验证

    我想知道是否有一种方法可以检查页面是否需要基于 web config 设置进行身份验证 基本上如果有这样的节点
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用

    我正在尝试将我的项目从 UseMVC asp net core 2 2 兼容样式 升级到 UseEndpoint Routing 并且我的所有请求都被重定向到我的验证失败页面 它与声明有关 如果我删除 Authorize Roles Adm
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • 显示异常时的自定义错误消息:从客户端检测到潜在危险的 Request.Form 值

    我在我的 Web 应用程序中使用 ASP NET 的登录控件 当发生此异常时 我想在标签上显示一种有趣的错误类型System Web HttpRequestValidationException A potentially dangerou
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet

随机推荐

  • 在 Woocommerce 结帐页面中的所有默认通知之前显示自定义通知

    我使用以下代码在结帐页面中向未登录的 woocommerce 用户 访客 显示自定义消息 add action woocommerce before checkout form my custom message function my c
  • 将保存/更新调用轨道转换为 sql

    我想获取运行时生成的sql save 当我在控制台中运行此命令时 irb main 018 0 gt a User last irb main 018 0 gt a first name gt Mohan irb main 019 0 gt
  • Powershell进度条

    我是 Powershell 新手 在获取进度条来使用 foreach object 循环时遇到问题 如果可能的话 感谢 Chris 下面是我到目前为止所得到的 我的问题是进度条到达某个点 然后出现错误 101 参数大于最大允许范围 100
  • 如果 RSS 源未更改,则不执行任何操作

    我想每隔几分钟运行一个Python脚本 该脚本首先从 rss feed 中获取最新文章 使用 feedparser 我想要的是 当最新的文章与上次运行的文章相同时 脚本就结束了 我该如何实现这个目标 既然你在 python 问题中提到 fe
  • UML 的高效替代方案

    我发现 UML 很难快速创建 我想更快地表达我的想法 特别是对于小型开源项目 如果它足够大 我会费心使用 UML 但是这个项目对于这种事情来说太小了 我不想要另一个让我觉得 不 我稍后再做 的工具 有什么建议么 UML 不是一种工具 而是一
  • 是否可以在免费套餐中使用 Google Cloud Kubernetes 集群?

    纵观免费套餐特点 https cloud google com free docs gcp free tier对于 Google Cloud 它指出 VM 实例必须位于以下区域us west1 VM 机器类型必须是f1 micro 因此 为
  • Java 方法中 byte[] 和 byte ... 的区别

    有人问我这两个方法参数之间有什么区别以及为什么要在专门分配的数组上使用 putMessage byte send putMessage byte send 我无法自信地回答他们 也不记得 叫什么 The 在你的第一个例子中被称为vararg
  • 如何在node.js后端获取昨天的日期?

    我在用日期格式包在节点后端 我可以使用获取今天的日期 var today dateFormat new Date 以相同或其他方式我想要昨天的约会 我仍然没有得到任何正确的方法 目前我正在使用大量代码手动计算昨天的日期 除了手动写入还有其他
  • 2 个容量相同的背包 - 为什么我们不能两次找到最大值

    如果给你一组具有值和重量的物品 w1 v2 w2 v2 wn vn 以及两个容量相等的背包 Knap1 和 Knap2 C 则目标是确定可以分别放入 Knap1 和 Knap2 的物品 S1 和 S2 的最佳子集 并最大化背包的价值和容量
  • 如何确保表单中编码的文本是utf8

    我有一个 html 框 用户可以用它输入文本 我想确保在框中输入的所有文本都以 UTF 8 编码或在用户完成输入时转换为 UTF 8 此外 我不太明白在输入文本框时如何选择各种UTF编码 一般来说 我对以下内容感到好奇 当用户在文本框中键入
  • Sql Server Management Studio 对象资源管理器消失 - 丢失 - 消失

    SQL Server 管理工作室Object Explorer菜单消失了 捷径F8和view gt object explorer方法也不做任何事情 我点击了键盘上的所有内容 用谷歌搜索 但什么也没有 我真的需要这个回来 在没有对象资源管理
  • Font Awesome 无法加载资源 /font/fontawesome-webfont.woff?v=3.0.1

    网站上一切看起来都很好 但这两个错误显示在控制台中 如果我点击该网址 就会下载字体 一直试图追踪这个问题一段时间 但我在控制台中收到两个错误 无法加载资源资源 font fontawesome webfont woff v 3 0 1无法加
  • JavaScript 超过超时时间

    我使用 jquery 开发移动应用程序 下面是我的代码 当我向包含的页面添加 5 或 6 行时 一切顺利 但如果我添加多行显示错误消息 Javascript执行超时 function succes recu list rubrique tx
  • 在 C++ 中查找大于 4GB 的文件? [复制]

    这个问题在这里已经有答案了 我正在使用 MS Visual Studio 2012 编译器 并且正在 x64 发布模式下构建 使用 ifstream 我可以读取大于 4GB 的文件 问题是 我无法找到 10GB 文件中间的位置 当我像这样使
  • SQL 计数日期范围

    我正在尝试查询 SQL 数据库以获取每个客户在特定日期范围内发出的订单数 我有一个订单列表如下 CustomerName ClientID DateOrdered Customer No 2 10 2011 11 25 Customer N
  • 如何在 OSX 10.9 上安装 gdb

    如何在 OSX 10 9 上安装 gdb 我尝试使用 macports port install gdb Password gt Updating database of binaries 100 0 gt Scanning binarie
  • Android MotionEvent.getActionIndex() 和 MultiTouch

    我试图在事件 MotionEvent ACTION MOVE 发生时获取指针 id 我通过调用 event getActionIndex 来做到这一点 但对于第二个 第三个 第四个和第五个手指 它总是返回 0 我在 Galaxy S I90
  • 当经度 > 90 时,Python 纬度/经度中点计算给出错误结果

    当给定两端点的纬度和经度时 我有一个短函数来计算线的中点的问题 简单来说就是当经度大于 90度或小于90度时都能正常工作 对于地球的另一半 它提供了一个有点随机的结果 该代码是 javascript 的 python 转换 位于http w
  • 通过 awk 将频率(出现次数)添加到我的文本表中

    给定这个输入表 pac1 xxx pac1 yyy pac1 zzz pac2 xxx pac2 uuu pac3 zzz pac3 uuu pac4 zzz 我需要将频率添加到第三列 如下所示 pac1 xxx 2 3 pac1 yyy
  • 程序接收到信号SIGPIPE,管道损坏

    我写了一个基于posix套接字的客户端程序 该程序创建多个线程并且将锁定服务器 但是在 gdb 调试期间 程序给出了一个信息 错误 gdb n Program received signal SIGPIPE Broken pipe Swit