• 5. TCP客户/服务器程序示例


    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,以免留下僵死进程。

    习题:

  • 相关阅读:
    理解jquery的$.extend()、$.fn和$.fn.extend()
    前端跨域请求原理及实践
    [leetcode]Minimum Path Sum
    [leetcode]Jump Game II
    [leetcode]Merge Intervals
    [leetcode]Length of Last Word
    [leetcode]Unique Paths
    [leetcode]Text Justification
    [leetcode]Binary Tree Level Order Traversal
    [leetcode]Jump Game
  • 原文地址:https://www.cnblogs.com/sammei/p/3960050.html
Copyright © 2020-2023  润新知