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 <stdio.h> <stdio.h></code>
<code>#include <sys/socket.h> <sys socket.h=""></code>
<code>#include <sys/types.h> <sys types.h=""></code>
<code>#include <netinet/in.h> <netinet in.h=""></code>
<code>#include <string.h> <string.h></code>
<code>#include <unistd.h><unistd.h></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>*)&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 *) &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>}</unistd.h></</code><code>string</code><code>.h></netinet></sys></sys></stdio.h></code>
运行结果:
