zoukankan      html  css  js  c++  java
  • vtun 中的__io_canceled变量和相关函数

    1、__io_canceled在lib.h中定义,

    /* IO cancelation */
    extern volatile sig_atomic_t __io_canceled;

     

    __io_canceled变量影响下列函数,

    static inline int read_n(int fd, char *buf, int len)
    {
        register int t=0, w;

        while (!__io_canceled && len > 0)
        {
            if( (w = read(fd, buf, len)) < 0 )
            {
            if( errno == EINTR || errno == EAGAIN )
            continue;
            return -1;
            }
            if( !w )
                return 0;
            len -= w; buf += w; t += w;
        }

        return t;
    }  

    static inline int write_n(int fd, char *buf, int len)
    {
        register int t=0, w;

        while (!__io_canceled && len > 0)
        {
            if( (w = write(fd, buf, len)) < 0 )
            {
                if( errno == EINTR || errno == EAGAIN )
                    continue;
                return -1;
            }
            if( !w ) return 0;
            len -= w; buf += w; t += w;
        }

        return t;
    }

    2、下面的函数改变__io_canceled变量,

    static inline void io_init(void)
    {
        __io_canceled = 0;
    }

    static inline void io_cancel(void)
    {
        __io_canceled = 1;
    }

    3、

    而io_cancel函数在下面函数中调用,

    static void sig_term(int sig)
    {
        vtun_syslog(LOG_INFO, "Closing connection");
        io_cancel();
        linker_term = VTUN_SIG_TERM;
    }

    static void sig_hup(int sig)
    {
        vtun_syslog(LOG_INFO, "Reestablishing connection");
        io_cancel();
        linker_term = VTUN_SIG_HUP;
    }

    4、

    当内核发出退出或挂起等信号时,会调用sig_term或sig_hup函数,从而改变__io_canceled的值,从而停止read_n  write_n.

  • 相关阅读:
    小总结:fibonacci数的产生
    pick the stone game
    温故知新的错题训练:Coin game
    《博弈论的诡计》
    思维+博弈论:字符串操作
    一下午的编程思索录
    2018中国大学生程序设计竞赛
    温故知新的经典贪心题目:今年暑假不AC?
    2019-2020新学的一些东西(持续更新)
    【半平面交】JZOJ3297. 【SDOI2013】逃考
  • 原文地址:https://www.cnblogs.com/helloweworld/p/2704235.html
Copyright © 2011-2022 走看看