《unix网络环境编程》 中20-7 的示例理解。

 #include    "unp.h"

 static void    recvfrom_alarm(int);

 void
dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
{
int n;
const int on = ;
char sendline[MAXLINE], recvline[MAXLINE + ];
fd_set rset;
sigset_t sigset_alrm, sigset_empty;
socklen_t len;
struct sockaddr *preply_addr; preply_addr = Malloc(servlen); Setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)); FD_ZERO(&rset); Sigemptyset(&sigset_empty);
Sigemptyset(&sigset_alrm);
Sigaddset(&sigset_alrm, SIGALRM); Signal(SIGALRM, recvfrom_alarm); while (Fgets(sendline, MAXLINE, fp) != NULL) {
Sendto(sockfd, sendline, strlen(sendline), , pservaddr, servlen); Sigprocmask(SIG_BLOCK, &sigset_alrm, NULL);
alarm();
for ( ; ; ) {
FD_SET(sockfd, &rset);
n = pselect(sockfd+, &rset, NULL, NULL, NULL, &sigset_empty);
if (n < ) {
if (errno == EINTR)
break;
else
err_sys("pselect error");
} else if (n != )
err_sys("pselect error: returned %d", n); len = servlen;
n = Recvfrom(sockfd, recvline, MAXLINE, , preply_addr, &len);
recvline[n] = ; /* null terminate */
printf("from %s: %s",
Sock_ntop_host(preply_addr, len), recvline);
}
}
free(preply_addr);
} static void
recvfrom_alarm(int signo)
{
return; /* just interrupt the recvfrom() */
}
#include <stdio.h>
#include <unistd.h>
#include <signal.h> static void handle_signal(int signo)
{
printf("come here\n");
return ;
} int main()
{
sigset_t signal_usr1, signal_old; sigemptyset(&signal_usr1);
sigaddset(&signal_usr1, SIGUSR1); sigprocmask(SIG_BLOCK, &signal_usr1, &signal_old);
signal(SIGUSR1, handle_signal); sleep(); sigprocmask(SIG_SETMASK, &signal_old, NULL); return ;
}

  将上边这个程序编译好之后,运行,运行期间向这个进程发送 SIGUSR1 信号,最后发现仍然后有 “come here” 输出。

  说明:

    sigprocmask 虽然将 SIGUSR1 屏蔽掉了,但是如果在屏蔽期间收到了 SIGUSR1 信号,解除屏蔽后会统一处理该信号。

  那么此时返回来看上边那个pselect 的例子就会发现,代码的意思是确保 SIGALRM 信号只在pselect 中处理

pselect 函数的更多相关文章

  1. UNIX网络编程读书笔记:pselect函数

    函数原型 pselect函数是由POSIX发明的,其原型如下: #include <sys/select.h> #include <signal.h> #include < ...

  2. 《APUE》中的函数整理

    第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. ...

  3. 【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数

    本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术 I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程.I/O ...

  4. UNIX环境高级编程——I/O多路转接(select、pselect和poll)

    I/O多路转接:先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已准备好进行I/O时,该函数才返回.在返回时,它告诉进程哪些描述符已准备好可以进行I/O. poll.pselect ...

  5. pselect 和 select

    pselect函数是由POSIX发明的,如今许多Unix变种都支持它. #include <sys/select.h> #include <signal.h> #include ...

  6. select函数详解(转)

    Select函数在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect. accept.recv或recvfrom这样的阻塞 ...

  7. Unix下五种IO模型

    http://blog.chinaunix.net/uid-25324849-id-247813.html 1. I/O模型 Unix下共有五种I/O模型 a. 阻塞I/O b. 非阻塞I/O c. ...

  8. 第十四章:高级I/O

    14.1:引言 本章内容包括非阻塞I/O.记录锁.系统V流机制.I/O多路转接(select和poll函数).readv和writev函数以及存储映射I/O(mmap),这些都称为高级I/O. 14. ...

  9. 基于select模型的udp客户端实现超时机制

    参考:http://www.cnblogs.com/chenshuyi/p/3539949.html 多路选择I/O — select模型 其思想在于使用一个集合,该集合中包含需要进行读写的fd,通过 ...

随机推荐

  1. react ES5 与ES6的写法

    ES5var React = require('react'); var ReactDOM = require('react-dom'); // 定义组件 var HelloMessage = Rea ...

  2. Java多态面试题案例几解题思路

    ---恢复内容开始--- Java多态面试题案例几解题思路 这道题是来自别人,先开始看到题很懵,后来有自己的思路: class A { public String show(D obj){ retur ...

  3. cakePHP的ajax弹出窗

    在html里添加一个触发弹出框的按钮 $("#button1").on("click", function() { $("#dialogue" ...

  4. target=_blank攻击

    [target=_blank攻击] 在<a>标签中加入 rel="noopener noreferrer" 来避免. 参考:https://mathiasbynens. ...

  5. Unity&UGUI

    UI:User Interface 用户交互接口,处理用户与程序直接的交互 新建一个UI控件,都会同时新建两个物体: --Canvas:画布,所有的UI控件都必须放到画布上 --EnventSyste ...

  6. 【C++】operator new/new operator/placement new之间的区别

    new operator new operator即是c++中的关键字new.比如A* = new A; 中的new就是new operator. 它执行了三个步骤: 1. 分配内存空间 事实上,分配 ...

  7. js常用返回网页顶部几种方法

    一.使用锚标记 此方法最简单,只需在body下放个隐藏的锚点标记,内容如下:  代码如下 复制代码 <a name="top" id="top">& ...

  8. codis

    总体架构 192.168.199.223(zookeeper.codis-proxy.codis-dashborad:18080.codis-fe:18090.codis-server) 192.16 ...

  9. python使用websocket简单组建聊天室

    server端 ###websocket_server### import socket import threading sock = socket.socket(socket.AF_INET, s ...

  10. CentOS 下部署weblogic12.1.1.0

    1.软件包 JDK 1.7.0 Weblogic 12.1.1.0 2.JDK安装完配置环境变量 export JAVA_HOME=/usr/java/jdk1.7.0_79 export CLASS ...