我为pthread_create()
创建了一个用于执行函数的线程,在函数内部有一个write()
函数来通过套接字描述符发送数据。如果write()
函数无法发送数据(因为套接字连接丢失),我的线程将被终止。
write()
失败时可以保留一个帖子吗?
这是我的代码:
void broadcastMsg(char *msg) {
int i=0;
while(1) {
...
...
// My thread terminated from here
if(write(client_database.sock_desc[i], msg, strlen(msg)) < 0) {
client_database.sock_desc[i] = -3;
i++;
continue;
}
i++;
}
}
/* Start thread from this function */
void *cliListener(void *argvp) {
int read_desc;
char buf[MAX_TRANSFER_BUF];
int cli_sock_desc_id = atoi(argvp);
while(1) {
memset(buf, 0, MAX_TRANSFER_BUF);
read_desc = read(client_database.sock_desc[cli_sock_desc_id], buf, MAX_TRANSFER_BUF);
...
...
broadcastMsg(buf);
}
}
int main(void) {
...
...
pthread_t tid_1;
pthread_create(&tid_1, NULL, cliListener, cli_listener_arg);
...
...
}
答案 0 :(得分:2)
如果您尝试写入管道或套接字描述符(管道或套接字的另一端已关闭)(因此没有人会读取它),系统将向您的进程发送一个SIGPIPE信号,默认情况下杀死进程 1 。您可以通过忽略SIGPIPE来避免这种命运,通常在main
函数的早期:
signal(SIGPIPE, SIG_IGN);
一旦你这样做,写入将不再杀死你的线程或进程;相反,它将返回错误(-1),并将errno设置为EPIPE
。您需要确保 始终 检查写入调用的返回值,并在出现错误时执行相应的操作,否则您的程序可能会在后台运行在你认为它已经停止之后...
1 根据您的设置方式,可能只杀死线程而不是整个过程,但为了一般的安全和卫生,它应该杀死整个过程