簡體   English   中英

信號處理程序在執行后結束進程

[英]signal handler ending the process after its execution

我正在編寫一個程序,並為SIGINT設置了一個信號處理程序:

volatile int exit_program = 0; //Global variable

void exit_client() {
    write(1, "Disconnecting...\n", strlen("Disconnecting...\n"));
    exit_program = 1;
}

然后在 main 中,我告訴進程在收到SIGINT時對exit_client()做出反應。

int main() {
    signal(SIGINT, exit_client);
    //...
}

稍后在主要過程中,我有以下代碼:

while (!exit_program) {

    //...

    socket_rcv(server_socket);
}

close(server_socket);
write(1, "Disconnected\n", strlen("Disconnected\n"));
    

我使用socket_rcv()從服務器套接字接收數據,如果read()返回值為 0(當服務器斷開連接時),我還會向進程發送SIGINT 我這樣做執行: raise(SIGINT)

socket_data socket_rcv(int socket) {
        
    //...

    do {
        bytes_read = read(socket, sequence + (115 - total_bytes), total_bytes+10);

        if (bytes_read == -1) write(1, "Read error\n", strlen("Read error\n"));
        if (bytes_read == 0) raise(SIGINT);
        total_bytes -= bytes_read;

    } while (total_bytes > 0);

    //...
}

但是,當同時執行服務器和客戶端並首先斷開服務器時,要查看客戶端的反應(應該打印Disconnecting...然后Disconnected以及服務器套接字已關閉),我只在信號處理程序中打印到確認信號處理程序已執行,但隨后程序終止並且它不會繼續執行以關閉套接字並執行最后一次write(1, "Disconnected\n", strlen("Disconnected\n")); .

為什么它會終止,我該如何解決?

此外,可能無關緊要,但socket_rcv() function 在另一個.c文件中聲明,包括主進程所在的.h模塊。

我同意評論者的觀點,為什么可以直接設置exit_program時使用信號處理程序?

無論如何,您的問題似乎在其他地方(也許read ?)或者您沒有向我們提供完整的圖片,因為這段代碼有效:

#include <signal.h>
#include <string.h>
#include <unistd.h>

volatile int exit_program = 0;

void exit_handler(int sig) {
    write(1, "exit_handler\n", strlen("exit_handler\n"));
    exit_program = 1;
}

int main() {
    int i = 0;

    signal(SIGINT, exit_handler);

    while (!exit_program) {
        write(1, "loop\n", strlen("loop\n"));

        if (i == 1) {
            raise(SIGINT);
        }

        ++i;
    }

    write(1, "done\n", strlen("done\n"));

    return 0;
}

印刷

loop
loop
exit_handler
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM