signal

信号是一种软件中断,异步发生,在进程运行的时候随时可能发生。信号可以:

  • 由一个进程发给另一个进程,或发给自身
  • 由内核发给某个进程

信号的action:

  1. signal handler,在信号发生时被调用,这个过程也称为捕获信号。SIGKILL/SIGSTOP两个信号不能被捕获。
  2. 设定SIG_IGN来忽略信号。SIGKILL/SIGSTOP两个信号不能被忽略。
  3. 设定SIG_DFL来启用信号的默认处理。

信号相关函数:

 #include <signal.h>

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

sigaction()用于改变进程对于某个信号的默认处理行为。成功返回0, 失败返回-1

  • signum指定某个信号,但不能为SIGKILL和SIGSTOP。
  • act是为signum指定的action
  • oldact 用于返回signum信号旧的action

struct sigaction结构内容类似下面这样:

           struct sigaction {
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flags;
};
  • sa_handler是信号的处理函数指针。指定为SIG_DFL则是默认行为,SIG_IGN则忽略该信号。
  • sa_mask 当一个信号到来时,信号处理函数被执行,POSIX规定此时默认阻塞该信号再次到来。sa_mask用于设置是否阻塞某个信号。
  • sa_flags 标志位,用于修饰一些细节行为

SIGCHLD

在本章5.9节的例子的过程:

  1. serv父进程阻塞于accept()中,子进程阻塞于read()中。
  2. client被手动终止,发送一个FIN给serv
  3. serv收到FIN,则递送一个EOF给子进程的read(),使得子进程结束
  4. 内核发送一个SIGCHLD给父进程,父进程执行信号处理函数。accept()被中断,则返回EINTR错误。于是父进程退出。

编写程序时需要注意的几点:

  1. fork子进程时,必须捕获SIGCHLD信号
  2. 捕获信号时,必须处理被中断的系统调用,EINTR。
  3. SIGCHLD信号处理函数中使用waitpid,以免留下僵死进程。

习题:

5. TCP客户/服务器程序示例的更多相关文章

  1. UNIX网络编程 第5章 TCP客户/服务器程序示例

    UNIX网络编程 第5章 TCP客户/服务器程序示例

  2. UNIX网络编程---TCP客户/服务器程序示例(五)

    一.概述 客户从标准输入读入一行文本,并写给服务器 服务器从网络输入读入这行文本,并回射给客户 客户从网络输入读入这行回射文本,并显示在标准输出上 二.TCP回射服务器程序:main函数 这里给了函数 ...

  3. TCP客户/服务器程序实例——回射服务器

    目录 客户/服务器程序源码 POSIX信号处理 POSIX信号语义 处理SIGCHLD信号 处理僵死进程 处理被中断的系统调用 wait和waitpid函数 wait和waitpid函数的区别 网络编 ...

  4. 第四章 基本TCP套接字编程 第五章 TCP客户/服务器程序实例

    TCP客户与服务器进程之间发生的重大事件时间表 TCP服务器 socket() --- bind() --- listen() --- accept() --- read() --- write -- ...

  5. TCP客户/服务器程序概述

    一个回射服务器: 1)客户从标准输入读入一行文本,并写给服务器 2)服务器从网络输入读入这行文本,并回射给客户 3)客户从网络输入读入这行回射文本,并显示在标准输出上 回射输入行这样一个客户/服务器程 ...

  6. 《Unix 网络编程》05:TCP C/S 程序示例

    TCP客户/服务器程序示例 系列文章导航:<Unix 网络编程>笔记 目标 ECHO-Application 结构如下: graph LR; A[标准输入/输出] --fgets--> ...

  7. 第5章-unix网络编程 TCP/服务端程序示例

    这一章主要是完成一个完整的tcp客户/服务器程序.通过一很简单的例子.弄清客户和服务器如何启动,如何终止,发生了某些错误会发生什么.这些事很重要的  客户端代码 #include "unp. ...

  8. 【unix网络编程第三版】阅读笔记(四):TCP客户/服务器实例

    本篇博客主要记录一个完整的TCP客户/服务器实例的编写,以及从这个实例中引发的对僵死进程的处理等问题. 1. TCP客户/服务器功能需求 本实例完成以下功能: (1) 客户从标准输入读入一行文本,并写 ...

  9. 第二十二篇:基于UDP的一对回射客户/服务器程序

    前言 之前曾经学习过一对回射客户/服务器程序的例子,不过那个是基于TCP协议的.本文将讲解另一对回射客户/服务器程序,该程序基于UDP协议. 由于使用的协议不同,因此编写出的程序也有本质上的区别,应将 ...

随机推荐

  1. 如何修改 WordPress 的默认 Gravatar 头像

    如何修改 WordPress 的默认 Gravatar 头像? wordpress默认的头像是下面这种 在Settings的Discussion中,默认选择第一个Mystery Person, 意思是 ...

  2. Linux 指令的快捷键

  3. pytorch中Math operation操作:torch.ger()

    torch.ger(vec1, vec2, out=None) → Tensor Outer product of vec1 and vec2. If vec1 is a vector of size ...

  4. ICMP TYPE CODE

    TYPE CODE Description Query Error 0 0 Echo Reply——回显应答(Ping应答) x   3 0 Network Unreachable——网络不可达   ...

  5. jQuery中文文档

    http://www.jquery123.com/ http://www.shifone.cc/

  6. SPOJ NSUBSTR Substrings ——后缀自动机

    建后缀自动机 然后统计次数,只需要算出right集合的大小即可, 然后更新f[l[i]]和rit[i]取个max 然后根据rit集合短的一定包含长的的性质,从后往前更新一遍即可 #include &l ...

  7. 【图论】bnuoj 52810 Splitting the Empire

    acm.bnu.edu.cn/v3/contest_show.php?cid=9208#problem/G [题意] 给定一个无向图,要求把这个无向图的点划分到不同的集合里,使得每个集合的点之间两两没 ...

  8. (转)WaitForSingleObject函数的使用

    WaitForSingleObject 函数 DWORD WaitForSingleObject( HANDLE hObject, DWORD dwMilliseconds ); 第一个参数hObje ...

  9. bzoj1975: [Sdoi2010]魔法猪学院【k短路&A*算法】

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2446  Solved: 770[Submit][Statu ...

  10. 转载免费的SSL证书

    目前我知道的有2种方式进行免费的SSL证书的获取 第一种:腾讯云申请 第二种:Let's Encrypt (国外在) 我一直使用第一种,还可以,有效期1年. 以下转载第二种: 实战申请Let's En ...