[解決済み] プログラムが信号SIGPIPEを受信した、パイプが破損している
2022-02-01 12:11:12
質問
私は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); ...
または
-
に対する明示的なハンドラをインストールします。
SIGPIPE
(通常は何もしない)。#include <signal.h> void sigpipe_handler(int unused) { } int main(void) { sigaction(SIGPIPE, &(struct sigaction){sigpipe_handler}, NULL); ...
いずれの場合も
send*()
/
write()
を返します。
-1
を設定し
errno
から
EPIPE
.
関連
-
[解決済み】Valgrind - strcpyのサイズ1の無効な書き込み
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】変数の警告が設定されているが使用されていない
-
[解決済み】 `S_ISREG()` とは何ですか、そして何をするのですか?
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】警告:引数「互換性のないポインタ型から」を渡す[デフォルトで有効]。
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み】execvp: バッドアドレスエラー
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】GCC Cコードで静的宣言が非静的宣言に続くことを解決するには?
-
[解決済み】 error: too few arguments to function `printDay' (C言語)
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み】警告:式の結果が未使用の場合
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?
-
[解決済み】SIGPIPEを防止する方法(または適切に処理する方法)について)