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

问题描述 投票:-4回答:1

我用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);
        ...
        ...
    }
c multithreading sockets
1个回答
2
投票

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

signal(SIGPIPE, SIG_IGN);

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


1取决于你如何设置它可能会杀死线程而不是整个过程,但为了一般的安全和卫生它应该杀死整个过程

© www.soinside.com 2019 - 2024. All rights reserved.