簡體   English   中英

C 語言:如何評估信號處理程序的返回值?

[英]C Language: how do I evaluate the return value of a signal handler?

在我正在編寫的代碼中,檢查信號處理程序的返回值以確保是否接收到信號將非常有用。 因此,例如,如果我有這種東西:

Message m;
sig_t s = signal(SIGALRM, sigalrm);
alarm(DURATION);
int status = msgrcv(msg_id, &m, sizeof(m.appointment), destination_mailbox, 0);

將要發生的是程序將在到達 msgrcv 命令時立即阻塞,因為它將等待消息。 但是,如果它在 DURATION 秒后沒有收到消息,則警報信號會將其喚醒,並且狀態將等於 -1。

現在,理想情況下,假設我想確保程序由於警報而不是其他原因喚醒。 比如說,msgrcv出錯了,程序就被喚醒了,但是狀態還是-1,m為空。

信號狀態返回值的 man 條目

signal() 返回信號處理程序的先前值,或 SIG_ERR 錯誤。 如果發生錯誤,則設置 errno 以指示原因。

如果我在調用信號處理程序后嘗試打印 sig_t 的值,我該怎么做? 這將打印“信號(零)”。

 printf("signal %p\n", s);

那么,如果我想要這樣的東西,我該如何處理這個返回值

if(s == a state where the handler was never called)
      do A;
else
      do B;

如果msgrcv被信號中斷,它應該返回-1並且errno應該設置為EINTR (除非使用sigaction改變了行為)。

所以要檢查這種情況:

int status = msgrcv(/*...*/);
if (status == -1) {
    if (errno == EINTR)) {
        /* interrupted by signal */
    }
    else {
        /* other error */
    }
}

如果需要專門檢查SIGALRM中斷,可以讓信號處理程序設置一個全局sig_atomic_t變量,然后在msgrcv返回后檢查。

暫無
暫無

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

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