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>
運作結果:
