天天看點

Linux IO模型漫談(6)- 信号驅動IO模型sigaction(查詢或設定信号處理方式)sigaction結構伺服器端:

unix上有定義了許多信号。源自berkeley的實作使用的是sigio信号來支援套接字和終端裝置上的信号驅動io。

在udp上,sigio信号會在下面兩個事件的時候産生:

1 資料報到達套接字

2 套接字上發上一部錯誤

是以我們很容易判斷sigio出現的時候,如果不是發生錯誤,那麼就是有資料報到達了。

而在tcp上,由于tcp是雙工的,它的信号産生過于平凡,并且信号的出現幾乎沒有告訴我們發生了什麼事情。是以對于tcp套接字,sigio信号是沒有什麼使用的。

int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

參數含義:

signum:所注冊的信号,我們這邊都設定為sigio

act :信号觸發所處理的函數

oldact:一般設定為null

這裡涉及到了

1

2

3

4

5

6

7

8

<code>struct</code> <code>sigaction</code>

<code>{</code>

<code>  </code><code>void</code> <code>(*sa_handler) (</code><code>int</code><code>);</code>

<code>  sigset_t sa_mask;</code>

<code>  </code><code>int</code> <code>sa_flags;</code>

<code>  </code><code>void</code> <code>(*sa_restorer) (</code><code>void</code><code>);</code>

<code>}</code>

sa_handler代表的是新的信号處理函數

sa_mask 用來設定在處理該信号時暫時将sa_mask 指定的信号擱置

sa_flags 用來設定信号處理的其他相關操作

下面的例子是基于udp的程式

用戶端:

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<code>#include &lt;stdio.h&gt; &lt;stdio.h&gt;</code>

<code>#include &lt;sys/socket.h&gt; &lt;sys socket.h=""&gt;</code>

<code>#include &lt;sys/types.h&gt; &lt;sys types.h=""&gt;</code>

<code>#include &lt;netinet/in.h&gt; &lt;netinet in.h=""&gt;</code>

<code>#include &lt;string.h&gt; &lt;string.h&gt;</code>

<code>#include &lt;unistd.h&gt;&lt;unistd.h&gt;</code>

<code>int</code> <code>main(</code><code>int</code> <code>argc, </code><code>char</code><code>* argv[])</code>

<code>    </code><code>int</code> <code>socketfd, n;</code>

<code>    </code><code>socketfd = socket(af_inet, sock_dgram, 0);</code>

<code>    </code> 

<code>    </code><code>struct</code> <code>sockaddr_in serv_addr;</code>

<code>        </code> 

<code>    </code><code>bzero((</code><code>char</code> <code>*)&amp;serv_addr, </code><code>sizeof</code><code>(serv_addr));</code>

<code>    </code><code>serv_addr.sin_family = af_inet;</code>

<code>    </code><code>serv_addr.sin_port = htons(7779);</code>

<code>    </code><code>connect(socketfd,(</code><code>struct</code> <code>sockaddr *)  &amp;serv_addr, </code><code>sizeof</code><code>(serv_addr));</code>

<code>    </code><code>write(socketfd, </code><code>"client message"</code><code>, 14);</code>

<code>    </code><code>return</code> <code>0;</code>

<code>}&lt;/unistd.h&gt;&lt;/</code><code>string</code><code>.h&gt;&lt;/netinet&gt;&lt;/sys&gt;&lt;/sys&gt;&lt;/stdio.h&gt;</code>

運作結果:

Linux IO模型漫談(6)- 信号驅動IO模型sigaction(查詢或設定信号處理方式)sigaction結構伺服器端:
Linux IO模型漫談(6)- 信号驅動IO模型sigaction(查詢或設定信号處理方式)sigaction結構伺服器端:

繼續閱讀