节目接收信号SIGPIPE,管道中断? [英] Program received signal SIGPIPE, Broken pipe.?

查看:158
本文介绍了节目接收信号SIGPIPE,管道中断?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写的基于POSIX套接字的客户端程序。该程序创建多个线程,并有继续锁定服务器。但在GDB的调试过程中程序提供了一个信息(错误)(GDB)N

I write a client program based on posix sockets. The program creates multiple threads and is going to lock the server. But during debug in gdb time the program gives an info (error) "(gdb) n

程序接收到的信号SIGPIPE,管道中断。 [切换主题
  0xb74c0b40(LWP 4864)] 0xb7fdd424在__kernel_vsyscall()(GDB)

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

这里的code

#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;
}

它是什么,做什么?

what it is and what to do?

推荐答案

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

The process received a SIGPIPE. The default behaviour for this signal is to end the process.

A SIGPIPE 被发送到一个进程,如果它试图写入套接字已被关闭写作或不连接(再)。

A SIGPIPE is sent to a process if it tried to write to a socket that had been shutdown for writing or isn't connected (anymore).

要避免该方案在这种情况下结束,你既可以

To avoid that the program ends in this case, you could either


  • 请的过程中忽略了 SIGPIPE

  • 安装了一个明确的处理程序 SIGPIPE (通常什么都不做)。

  • make the process ignore SIGPIPE or
  • install an explicit handler for SIGPIPE (typically doing nothing).

在这两种情况下发送*() / 的write()将返回 -1 并设置错误号 EPIPE

In both cases send*()/write() would return -1 and set errno to EPIPE.

这篇关于节目接收信号SIGPIPE,管道中断?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆