gpt4 book ai didi

c - 为什么 write() 终止我的线程?

转载 作者:行者123 更新时间:2023-11-30 21:19:31 25 4
gpt4 key购买 nike

我使用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);
...
...
}

最佳答案

如果您尝试写入管道或套接字描述符,而管道或套接字的另一端已关闭(因此没有人会读取它),系统将向您的进程发送 SIGPIPE 信号,默认情况下,该信号将发送到您的进程。终止进程1。您可以通过忽略 SIGPIPE 来避免这种命运,通常在 main 函数的早期:

signal(SIGPIPE, SIG_IGN);

一旦你这样做了,写入将不再杀死你的线程或进程;相反,它将返回错误 (-1),并将 errno 设置为 EPIPE。您需要确保始终检查写入调用的返回值,并在出现错误时执行适当的操作,否则您的程序可能会在后台运行当你认为它已经停止之后......

<小时/>

1根据您的设置方式,它可能只会杀死线程而不是整个进程,但为了一般安全和卫生,它应该杀死整个进程

关于c - 为什么 write() 终止我的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47955593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com