天天看点

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结构服务器端: