节目接收信号SIGPIPE,管道中断? [英] Program received signal SIGPIPE, Broken pipe.?
问题描述
我写的基于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屋!