2012-03-03 38 views
2
struct siginfo { 

    int si_signo; /* signal number */ 
    int si_errno; /* if nonzero, errno value from <errno.h> */ 
    int si_code; /* additional info (depends on signal) */ 
    pid_t si_pid; /* sending process ID */ 
    uid_t si_uid; /* sending process real user ID */ 
    void *si_addr; /* address that caused the fault */ 
    int si_status; /* exit value or signal number */ 
    long si_band; /* band number for SIGPOLL */ 
    /* possibly other fields also */ 

}; 

我不明白si_band什麼是SIGPOLL的樂隊號碼?

回答

1

如果你看一下Linux聯機幫助頁sigaction,你會發現:

  • SIGPOLL/SIGIO填寫si_bandsi_fdsi_band事件是一個位掩碼 ,其中包含的值與在revents字段中填寫的值相同poll(2)si_fd字段指示發生I/O事件 的文件描述符。

什麼是位掩碼手段可以在鏈接的手冊頁中找到的解釋 - 實際上,它告訴什麼類型的事件的觸發信號的信號處理器(而在Linux至少,你也可以得到相應的文件描述符)。

我不確定這是多麼便攜。 si_band似乎在POSIX中,但不是si_fd。參考:POSIX <signal.h>POSIX poll(2)

1

進程可以請求SIGPOLL信號以實現異步I/O。從man page of sigactions

SIGPOLL/SIGIO填寫si_band和si_fd。 si_band事件是一個 位掩碼,其中包含與poll(2)在revents字段 中填充的值相同的值。

revents描述發生的事件的類型並導致SIGPOLL被髮送。該man page of poll,描述得很詳細:

領域revents爲輸出參數,由內核與 實際發生的事件填滿。可以從 返回的位包括:

POLLIN There is data to read. 

POLLPRI 
     There is urgent data to read (e.g., out-of-band data on TCP 
     socket; pseudoterminal master in packet mode has seen state 
     change in slave). 

POLLOUT 
     Writing now will not block. 

POLLRDHUP (since Linux 2.6.17) 
     Stream socket peer closed connection, or shut down writing half 
     of connection. The _GNU_SOURCE feature test macro must be 
     defined (before including any header files) in order to obtain 
     this definition. 

POLLERR 
     Error condition (output only). 

POLLHUP 
     Hang up (output only). 

POLLNVAL 
     Invalid request: fd not open (output only).