![](/img/trans.png)
[英]What happens after the execution of a handler function on the SIGCHLD signal in C?
[英]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.