zoukankan      html  css  js  c++  java
  • 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,以免留下僵死进程。

    习题:

  • 相关阅读:
    Shared Memory in Windows NT
    Layered Memory Management in Win32
    软件项目管理的75条建议
    Load pdbs when you need it
    Stray pointer 野指针
    About the Rebase and Bind operation in the production of software
    About "Serious Error: No RTTI Data"
    Realizing 4 GB of Address Space[MSDN]
    [bbk4397] 第1集 第一章 AMS介绍
    [bbk3204] 第67集 Chapter 17Monitoring and Detecting Lock Contention(00)
  • 原文地址:https://www.cnblogs.com/sammei/p/3960050.html
Copyright © 2011-2022 走看看