マルチスレッドのクライアントサーバーアプリケーションがあります。最初のスレッドは、ファイル記述子の配列にクライアントを追加する「リスナー」です。
while (1) {
if ((connfd = accept(listenfd_service, (struct sockaddr *) &cliaddr, &clilen)) > 0) {
printf("service connected...\n");
int i;
for (i = 0; i < MAX_SERVICES; i++) {
if (service_sockets[i] == -1) {
service_sockets[i] = connfd;
break;
}
}
}
}
問題は、Ctrl + Cでクライアントを終了し、次の行を実行すると
for (j = 0; j < MAX_SERVICES; j++) {
if (service_sockets[j] != -1) {
int test = write(service_sockets[j], c, 72);
if (test == -1) {
service_sockets[j] = -1;
}
}
}
'test'変数で72を取得します。これらの行を2回実行しようとすると、SIGPIPEシグナルが表示されます。