Linux网络编程的相关信号

来源:互联网 发布:hive 数据倾斜 编辑:程序博客网 时间:2024/05/18 20:34

《Linux高性能服务器编程》阅读笔记:

  SIGHUP、SIGPIPE和SIGURG是网络编程中密切相关的信号。

  SIGHUP: SIGHUP信号的触发时机是在进程的控制终端被挂起,对于没有控制终端的网络后台程序来说,通常是利用SIGHUP信号来强制服务器程序重读相关的配置文件,一个典型的例子就是xinetd超级服务器程序。

  SIGPIPE: 往读端关闭的管道或socket连接中写数据将会触发SIGPIPE信号,在Linux网络编程基础API–TCP的数据读写API中讲道,对端close()通信连接后,本端继续发数据,本端将会收到一个RST复位报文提示本端对端已经关闭连接、需重新建立连接,此时再继续往对端发数据,本端系统将会产生SIFPIPE信号。服务器程序需要在代码中捕获并处理该信号,或者至少忽略它,因为SIGPIPE信号的默认处理行为是结束所在进程。引起SIGPIPE信号的写操作将设置errno为EPIPE。send()系统调用的MSG_NOSIGNAL可选项可禁止写操作触发SPGPIPE信号,所以在这种情况下可以使用send()函数反馈的errno值来判断管道或者socket连接的对端是否关闭。
  此外,前面学习IO复用时讲道,IO复用也可以用来检测管道和socket连接的读(对)端是否已经关闭,如poll,当读对端关闭时,本(写)端描述符的POLLHUP事件将被触发,当socket连接被对端关闭时,socket上的POLLRDHUP事件将被触发。

  SIGURG:在前面的IO复用技术中,select()等系统调用在接收到带外数据时将能够返回并返回异常事件(select()是exceptfds),另一种方法就是利用SIGURG信号:

typedef void(*handle_func)(int);//SIGURG的信号处理函数,负责读带外数据void sig_urg(int sig){    int errno_bak = errno;    char buf[BUFZE] = {0};    int ret = recv(connfd, buf, BUFSE - 1, MSG_OOB);    printf("%d byte OOB data: %s\n", ret, buf);    errno = errno_bak;}//为SIGURG信号绑定操作函数等行为int add_signal(int sig, handle_func func){    struct sigaction sa;    bzero(&sa, sizeof(sa));    sa.sa_handler = func;    sa.sa_flags |= SA_RESTART;  //重新调用被该信号终止的系统调用,保证服务端程序一直运行    sigfillset(&sa.sa_mask);    //屏蔽其它所有所有信号    return sigaction(sig, &sa, NULL);}int main(void){    //...    add_signal(SIGURG, sig_urg);        //注册信号捕捉函数    fcntl(connfd, F_SETOWN, getpid());  //设置SIGURG信号关联的fd的宿主进程或进程组    char buf[BUFSE] = {0};    while (1)   //循环读数据    {        bzeor(buf, BUFSZ);        ret = recv(connfd, buf, BUFSZ - 1, 0);        if (ret <= 0)            break;        printf("%d byte Normal data: %s\n", ret, buf);    }    close(fd);    close(sock_fd);    return 0;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 黑鲨手柄怎么用 xbox手柄为啥不建议用充电电池 蓝牙手柄怎么连接手机 手柄映射软件 手柄按键对应图 新游手柄助手 葡萄手柄助手 制图中手柄一步一步画法步骤 手柄连接电脑 手柄什么牌子好 xbox手柄连接手机 ps4手柄怎么关 电视手柄助手 机械制图手柄画法图解图片 xbox手柄使用教程 ps4手柄连接电脑win10 xbox手柄电池 蓝牙虚拟手柄 电脑手柄哪个好 什么手柄好用 电脑手柄怎么用 电脑手柄模拟器 手机手柄怎么用 手机手柄哪个好 安卓手柄映射软件 手机手柄模拟器 手柄多少钱一个 蓝牙手柄价格 手柄怎么连接电脑 怎么连接手柄 蓝牙手柄怎么用 xbox手柄怎么连电脑 xbox手柄多少钱 ipega蓝牙手柄怎么用 xbox手柄怎么用 xbox手柄怎么连接电脑 手机手柄推荐 手机手柄映射 xboxones手柄 多功能方向盘 任天堂免费修手柄