精华内容
下载资源
问答
  • linux信号处理机制

    千次阅读 2014-07-06 23:20:05
    学习一下信号的处理机制。   一、信号的产生 信号是有可能来自内核,也有可能来自进程。当然,最根本的来源是信号产生函数。 其实就是通过内核更新目标进程的数据结构以表示一个信号已经被发送。 其中为进程...

    学习一下信号的处理机制。

     

    一、信号的产生

        信号是有可能来自内核,也有可能来自进程。当然,最根本的来源是信号产生函数。

        其实就是通过内核更新目标进程的数据结构以表示一个信号已经被发送。

        其中为进程产生信号的函数有:

    函数名

    说明

    send_sig()

    向单一进程发送信号

    send_sig_info()

    与send_sig()类似,只是还使用siginfo_t结构中的扩展信息

    force_sig()

    发送既不能被进程显示忽略,也不能被进程阻塞的信号

    force_sig_info()

    与force_sig()类似,只是还使用siginfo_t结构中的扩展信息

    force_sig_specific()

    与force_sig()类似,但是优化了对SIGSTOP和SIGKILL信号的处理

    sys_tkill()

    tkill()的系统调用处理函数

    sys_tgkill()

    tgkill()的系统调用处理函数

     

             为线程组产生信号的函数有:

    函数名

    说明

    send_group_sig_info()

    向某一个线程组发送信号,该线程组由它的一个成员进程的描述符来识别

    kill_pg()

    想一个进程组中的所有线程组发送信号

    kill_pg_info()

    与kill_pg()类似,只是还使用siginfo_t结构中的扩展信息

    kill_pg_proc()

    向某一个线程组发送信号,该线程组由它的一个成员进程的pid来识别

    kill_pg_proc_info()

    与kill_pg_proc ()类似,只是还使用siginfo_t结构中的扩展信息

    sys_kill()

    kill()的系统调用处理函数

    sys_rt_sigqueueinfo()

    rt_sigqueueinfo()的系统调用处理函数

     

     

    二、信号的传递

        当内核注意到一个信号到来,并调用相关函数为接受此信号的进程准备描述符。但是万一这个进程那一刻并不在CPU上运行,内核就只能延迟传递信号的任务。因此这里就有两个queue,分别储存私有信号和共享信号。每当内核处理完一个中断或异常时,就检查是否存在挂起信号(即检查TIF_SIGPENDING)。如果存在挂起信号,那么内核就会调用do_signal函数。这个函数会循环执行,直到将两个队列中的所有非阻塞信号都处理完才退出。

        既然直到do_signal()整个过程干了什么,那么接下来就描述一下对于每一个信号,do_signal会进行怎么样的处理。首先,它会检查current接收进程是否受到其他一些进程的监控;在肯定的情况下,do_signal函数调用相关函数让监控进程知道current接收进程的信号处理;然后do_signal()要把处理信号的k_sigaction数据结构的地址赋值给局部变量ka,再根据ka内容来执行三种操作:忽略信号、执行缺省操作或执行信号处理程序。

     

    三、信号的处理

        在第二点中已经提到了进程收到信号之后的可能三种操作。这里只描述执行信号处理程序的过程。这个过程比较复杂。

        如果信号有一个专门的处理程序,那么do_signal()函数就会通过调用handle_signal()来强迫该处理程序执行。但是信号处理程序都是用户态进程所定义的,并包含在用户态的代码段中。handle_signal()函数运行在内核态,而信号处理程序运行在用户态,这就意味着在当前进程恢复“正常”执行之前,它首先必须执行用户态的信号处理程序。而且当内核打算恢复进程的正常执行时,内核态堆栈不再包含被中断程序的硬件上下文,因为每当从内核态向用户态转换时内核态堆栈都会被清空。而如果信号处理程序调用了系统调用,那么这个执行过程的复杂程度就更高了。

        Linux对此过程的解决方案是把保存在内核态堆栈中的硬件上下文拷贝到当前进程的用户态堆栈中。用户态堆栈也以这样的方式被修改,当信号处理程序终止时,自动调用sigreturn()系统调用把这个硬件上下文拷贝回内核态堆栈中,并回复用户态堆栈中原来的内容。

    该过程流程图如下:

     

     

    更多的细节不在此描述了。

    展开全文
  • Linux 信号机制

    千次阅读 2013-09-04 07:43:10
    Linux 信号机制详解   信号 Linux信号是一种“软中断”处理机制,它提供了一种处理异步事件的方法;信号也可用于进程间通信(一个进程可以向另一个进程发送信号)。   信号的分类 1、 按可靠性:分为可靠信号及不...

    Linux 信号机制详解

     

    信号

    Linux信号是一种“软中断”处理机制,它提供了一种处理异步事件的方法;信号也可用于进程间通信(一个进程可以向另一个进程发送信号)。

     

    信号的分类

    1、  按可靠性:分为可靠信号及不可靠信号

    不可靠信号是指信号可能会丢失,即在信号处理函数执行期间,如果该信号产生多次则只保留一次(调用一次信号处理函数),其余的都会被丢失。信号值小于SIGRTMIN的信号都属于不可靠信号。

    可靠信号支持排队,不会丢失;值大于等于SIGRTMIN的信号都属于可靠信号。

    注意:现在的linux版本中信号是否可靠跟signal或sigaction函数没关系,在一些比较老的文档中可能会提到信号是否可以跟注册函数相关。

     

    (文档末尾提供信号可靠性测试函数)

    2、  按实时性:分为实时信号与非实时信号

    实时信号即是可靠信号,它支持排队,不会丢失;非实时信号即是不可靠信号。

     

    信号的响应方式

    进程支持三种方式响应信号:A、忽略信号,即对信号不做任合处理,但SIGKILL及SIGSTOP信号不能被忽略(相信大家应该都知道为什么不能被忽略了)。B、按缺省方式处理,linux对每种信号都规定了缺省动作。C、捕捉信号,这也是我们最常用的方式,注册一个信号处理函数,当信号到达时会调用注册的处理函数。

     

    查看系统中支持的信号

    使用Kill –l 命令可以显示出当前系统支持的所有信号。我的系统中支持如下信号:

    1) SIGHUP      2) SIGINT        3) SIGQUIT     4) SIGILL

     5)SIGTRAP     6) SIGABRT    7) SIGBUS       8) SIGFPE

     9)SIGKILL       10) SIGUSR1     11) SIGSEGV     12)SIGUSR2

    13) SIGPIPE      14)SIGALRM   15) SIGTERM   16) SIGSTKFLT

    17) SIGCHLD    18)SIGCONT    19) SIGSTOP     20) SIGTSTP

    21) SIGTTIN      22)SIGTTOU    23) SIGURG      24) SIGXCPU

    25) SIGXFSZ      26)SIGVTALRM        27) SIGPROF     28) SIGWINCH

    29) SIGIO 30)SIGPWR      31) SIGSYS        34) SIGRTMIN

    35) SIGRTMIN+1      36) SIGRTMIN+2      37)SIGRTMIN+3      38) SIGRTMIN+4

    39) SIGRTMIN+5      40) SIGRTMIN+6      41)SIGRTMIN+7      42) SIGRTMIN+8

    43) SIGRTMIN+9      44) SIGRTMIN+10    45)SIGRTMIN+11    46) SIGRTMIN+12

    47) SIGRTMIN+13    48) SIGRTMIN+14    49)SIGRTMIN+15    50) SIGRTMAX-14

    51) SIGRTMAX-13    52) SIGRTMAX-12    53)SIGRTMAX-11    54) SIGRTMAX-10

    55) SIGRTMAX-9       56) SIGRTMAX-8       57)SIGRTMAX-7       58) SIGRTMAX-6

    59) SIGRTMAX-5       60) SIGRTMAX-4       61)SIGRTMAX-3       62) SIGRTMAX-2

    63) SIGRTMAX-1       64) SIGRTMAX

     

    这里有一个很有用的信号SIGTERM,当进程退出时可以捕捉此信号做一些清理操作。Linux系统关机时会向所有进程发送SIGTERM信号。

     

    不可靠信号测试函数:

     

    /***SIGINT不可靠信号处理函数***/

    void sigint_f(int signo)

    {

           static int a = 0;

     

           if (a++ == 0)

     {

                                         /***第一次捕捉到SIGINT信号时会执行此if分支***/

                    printf("signo(%d) sleepstart...\n", signo);

                    sleep(10);

                    printf("signo(%d) sleepend...\n", signo);

           }

           else

           {

                                         /***除第一次外,后续处理函数会执行此else分支***/

     printf("uncertain signal signo(%d)\n", signo);

           }

    }

     

    int main(void)

    {

                       //捕捉SIGINT信号

         signal(SIGINT, sigint_f);

           while(1) sleep(1);

           return 0;

    }

     

    测试方法

    在终端1上执行测试函数(注意查看输出结果):


     

    在终端2上给signal_test进程(用ps命令找出进程号)发送SIGINT信号:

     

    函数原理:当第一次捕捉到SIGINT信号后,进程输出signo(2) sleep start...后会休眠10秒,在这10秒内向此进程发送SIGINT信号四次,休眠结束后会输出signo(2)sleep end….。处理函数结束后会继续被调用,这时uncertainsignal signo(2)只输出一次。

     

    可靠信号测试函数:

    void sigrtmin_f(int signo)

    {

           static int a = 0;

     

           if (a++ == 0)

                 {

                    printf("signo(%d) sleepstart...\n", signo);

                    sleep(10);

                    printf("signo(%d) sleepend...\n", signo);

           }

           else

           {

                    printf("certain signalsigno(%d)\n", signo);

           }

    }

     

    int main(void)

    {

           signal(SIGRTMIN, sigrtmin_f);

     

           while(1) sleep(1);

           return 0;

    }

     

    在终端1上执行测试函数(注意查看输出结果):


    在终端2上给signal_test进程发送SIGRTMIN信号

     

    在进程休眠期间,共发送4次SIGRTMIN信号给进程,输出结果中显示了4条结果:



    展开全文
  • Linux的信号机制

    千次阅读 2018-08-23 13:53:42
    信号机制 信号机制是一种使用信号来进行进程之间传递消息的方法,信号的全称为软中断信号,简称软中断。信号的本质是软件层次上对中断的一种模拟(软中断)。它是一种异步通信的处理机制,事实上,进程并不知道信号...

    信号机制

    信号机制是一种使用信号来进行进程之间传递消息的方法,信号的全称为软中断信号,简称软中断。信号的本质是软件层次上对中断的一种模拟(软中断)。它是一种异步通信的处理机制,事实上,进程并不知道信号何时到来。

    在头文件<signal.h>中定义了64种信号,这些信号的名字都以SIG开头,且都被定义为正整数,称为信号编号。可以用“kill -l”查看信号的具体名称。

    上图中编号为1~31的信号为早期Linux所支持的信号,是不可靠信号(非实时的),编号为34~63的信号时后来扩充的,称为可靠信号(实时信号)。不可靠信号与可靠信号的区别在于前者不支持排队(这意味着如果内核已经注册了这个信号,那么便不会再去注册,对于进程来说,便不会知道本次信号的发生),可能会造成信号丢失,而后者的注册机制是每收到一个可靠信号就会去注册这个信号,不会丢失。

    信号的产生

    Linux中的信号可以由以下几种方式产生:

    ·当用户按下某些终端按键后引发终端产生信号,如“Ctrl+C”等。

    ·硬件产生的异常信号,例如除数为0、无效的内存访问等。这种异常信号通常会由硬件检测并通知Linux内核,然后内核产生信号发送给相关进程。

    ·进程使用系统调用函数kill可以给一个进程或者进程组发送一个信号,此时发送和接收信号的进程/进程组的所有者必须相同。

    ·用户调用kill命令将信号发送给其他进程,如经常使用kill终止进程一样。

    ·当检测到某种软件条件已经发生,并将其通知有关进程的时候也会产生信号,例如SIGURG信号就是在接收到一个通过网络传送的外部数据时产生的。

    信号处理方式

    Linux的每一个信号都有一个缺省的动作,典型的缺省动作是终止进程,当一个信号到来的时候收到这个信号的进程会根据信号的具体情况提供一下三种不同的处理方式:

    ·对于需要处理的信号,指定处理函数,由该函数来处理。

    ·忽略某个信号,对该信号不做任何处理。

    ·对该信号的处理保留系统的默认值,这种缺省操作大多数使得进程终止,进程通过系统调用signal函数来指定进程对某个信号的处理行为。

    信号处理过程

    Linux内核给一个进程发送软中断的方法是:在进程所在的进程表项的信号域设置对应信号的位(在PCB中设置)。如果信号发送给一个正在睡眠的进程,如果进程的优先级是可中断的,则唤醒进程,否则仅设置PCB中信号域相应的位而不唤醒进程。一个进程检查是否收到信号的时机是:一个进程在即将从内核态切换到用户态时;或者再一个进程要进入或离开一个适当的低调度优先级睡眠状态时。

    内核处理一个进程收到的软中断信号是在该进程的上下文中,因此进程必须处于运行状态。如果进程收到一个需要捕获的信号,会在进程从内核态返回到用户态时执行用户定义的函数,而且内核会在用户栈上创建一个新的空间来处理,该空间将返回地址的值设置成用户定义的处理函数的地址,这样进程从内核返回栈顶时就返回到用户定义的函数处,从函数返回再弹出栈顶时,才返回原先进入内核的地方。

    Linux信号的使用方法

    注册信号

    指的是在目标进程中注册,该目标进程中有未决信号的信息。对于已经有自己的中断处理例程的信号而言,其注册就是一个用户进程自己定义的处理函数去替换Linux内核预定义的函数动作。例如“Ctrl+C”是中止当前进程的运行,按下组合键后会产生一个中断,当前进程会接收到一个SIGINT信号,然后找到对应的处理例程是终止当前进程。我们也可以自己注册信号,将SIGINT信号对应的处理例程改为我们想要的操作。

    struct sigpending{
        struct sigqueue *head, **tail;
        sigset_t signal;
    };
    
    struct sigqueue{
        struct sigqueue *next;
        siginfo_t info;
    };

    其中 sigqueue结构组成的链称之为未决信号链,sigset_t称之为未决信号集,*head,**tail分别指向未决信号链的头部与尾部,siginfo_t info是信号所携带的信息。

    信号注册的过程就是将信号值加入到未决信号集siginfo_t中,将信号所携带的信息加入到未决信号链的某一个sigqueue中去。因此,对于可靠的信号,可能存在多个未决信号的sigqueue结构,对于每次信号到来都会注册。而不可靠信号只注册一次,只有一个sigqueue结构。只要信号在进程的未决信号集中,表明进程已经知道这些信号了,还没来得及处理,或者是这些信号被阻塞。

    在Linux中,可以通过signal和sigaction函数注册信号并指定接收到该信号时需要完成的动作,对于已经有自己的功能动作的信号而言其注册就是用一个用户自己定义的动作去替换Linux内核预定义的动作。

    signal函数

    signal函数可以为一个特定的信号(除了无法捕获的SIGKILL和SIGSTOP信号)注册相应的处理函数。如果正在运行的程序源代码里注册了针对某一信号的处理程序,不论当时程序执行到何处,一旦进程接收到该信号,相应的调用就会发生。

    #include <signal.h>
    
    void (*signal(int signum, void (*handler)(int)))(int);

    参数signum表示所注册函数针对的信号名称,参数handler通常是指向调用函数的函数指针,即所谓的信号处理函数。

    信号处理函数handler可能是用户自定义的一个函数,也可能是两个在头文件<signal.h>中进行定义的值:

    ·SIG_IGN:忽略signum指出的信号。

    ·SIG_DFL:调用系统定义的缺省信号处理。

    当signal函数调用成功后返回信号以前的处理配置,如果调用失败则返回SIG_ERR(-1)。需要注意的是并非程序执行到signal调用时就立即对指定的信号进行操作,因为信号的产生式无法预期的,利用signal设置信号处理函数只是告诉系统对这个信号用什么程序来处理。

    sigaction函数

    相较于signal函数,sigaction函数在完成信号注册工作的同时提供了更多功能选择。

    #include <signal.h>
    
    int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

    其中,参数signum指定要处理的信号,act和oldact都是指向信号动作结构的指针,该结构定义如下:

    struct sigaction {
        void (*sa_handler)(int);
        void (*sa_sigaction)(int, siginfo_t *, void *);
        sigset_t sa_mask;
        int sa_flags;
    };

           sa_handler用于指向信号处理函数的地址,参数sa_sigaction是指向函数的指针。它指向的函数有三个参数,其中第二个为siginfo_t结构体,定义如下:

    struct siginfo_t {
        int si_signo;        //Signal number
        int si_errno;        //Errno value
        int si_code;         //Signal code
        pid_t si_pid;        //Sending process ID
        uid_t si_uid;        //Real user ID of sending process
        int si_status;       //Exit value or signal
        clock_t si_utime;    //User time consumed
        clock_t si_stime;    //System time consumed
        signal_t si_value;   //Signal value
        int si_int;          //POSIX.1b signal
        void *si_ptr;        //POSIX1.b signal
        void *si_addr;       //Memory location that caused fault
        int si_band;         //Band event
        int si_fd;           //File descriptor
    };

           sa_flags用于指示信号处理函数的不同选项,可以通过“|”连接不同的参数,从而实现所需的选项设置。具体的可选参数如下表所示:

    sa_flags可选项及对应设置
    sa_flags对应设置
    SA_NOCLDSTOP

    用于指定信号SIGCHLD,当子进程被中断时,不产生此信号,当且仅当子进程结束时产生该信号

    SA_NOCLDWAIT当信号为SIGCHLD时,此选项可以避免子进程的僵死
    SA_NODEFER当信号处理程序正在运行时,不阻塞信号处理函数自身的信号功能
    SA_NOMASK同SA_NODEFER
    SA_ONESHOT当用户注册的信号处理函数被调用过一次之后,该信号的处理程序恢复为缺省的处理函数
    SA_RESETHAND同SA_ONESHOT
    SA_RESTART使本来不能进行自动重新运行的系统调用自动重新启动
    SA_SIGINFO表明信号处理函数是由sa_sigaction指定,而不是由sa_handler指定,它将显示更多处理函数的信息

     

           实例如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    
    void signalDeal(int sig, siginfo_t *info, void *t) {
        if (sig == SIGINT) {
            printf("Ctrl+C被按下\n");
        }
        else if (sig == SIGQUIT) {
            printf("Ctrl+/被按下\n");
        }
        else {
            printf("其他信号\n");
        }
    }
    
    int main(int argc, char *argv[])
    {
        struct sigaction act;
        act.sa_sigacion = signalDeal;
        sigempty(&act.sa_mask);
        act.sa_flags = SA_SIGINFO;
        sigaction(SIGINT, &act, NULL);
        sigaction(SIGQUIT, &act, NULL);
        while (1) {}
        return 0;
    }

     

    发送信号

     kill函数

           kill函数将信号发送给进程或者进程组。

    #include <signal.h>
    #include <sys/types.h>
    
    int kill(pid_t pid, int sig);

           其中pid参数的取值如下:

    pid参数取值及其定义
    pid含义
    pid > 0将信号发送给进程号为pid的进程
    pid = 0将信号发送给与目前进程相同进程组的所有进程
    pid < 0 && pid != -1向进程组ID为pid绝对值的进程组中的所有进程发送信号
    pid = -1除发送给自身进程外,还向所有进程ID大于1的进程发送信号

           sig参数对应的是信号编码,当其为0(即空信号)时,实际不发送任何信号,但照常进行错误检查。因此可用于检查目标进程是否存在,以及当前进程是否具有向目标发送信号的权限。

    raise函数

           raise函数向自身所在进程发送一个信号。

    #include <signal.h>
    
    int raise(int sig);

    sigqueue函数

           sigqueue主要是针对实时信号提出的(当然也支持非实时信号)信号发送函数,通常与函数sigaction配合使用。

    #include <signal.h>
    
    int sigqueue(pid_t pid, int sig, const union sigval value);
    
    typedef union sigval {
        int sival_int;
        void *sival_ptr;
    }sigval_t;

           sigqueue比kill传递了更多的附加信息,但sigqueue只能向一个进程发送信号,不能发送信号给一个进程组。

    Linux信号集

           在Linux系统的实际应用中,常常需要将多个信号组合起来使用,这种用来表示多个信号的数据类型被称为信号集(signal set),其定义格式为sigset_t。

    #include <signal.h>
    
    typedef struct {
        unsigned long sig[_NSIG_WORDS];
    }sigset_t;

           有5个函数用于信号集的操作:

    #include <signal.h>
    
    //前4个函数若调用成功则返回0,否则返回-1
    int sigemptyset(sigset_t *set);    //用于将参数set所指向的信号集设为空,即不包含任何信号
    int sigfillset(sigset_t *set);    //用于将参数set所指向的信号集设定为满,即包含所有的信号
    int sigaddset(sigset_t *set, int signum);    //用于将参数signum所代表的信号添加到参数set所指向的信号集中
    int sigdelset(sigset_t *set, int signum);    //用于将参数signum所代表的信号从参数set所指向的信号集中删除
    int sigismember(const sigset_t *set, int signum);    //用于检查参数signum是否位于参数set所指向的信号集中,如果为真则返回1,为假则返回0,出错则返回-1

    信号的阻塞和挂起

           在实际应用中,有时候既不希望进程在接收到信号时立刻中断,也不希望该信号完全被忽略,而是希望进程延迟处理。这可以通过阻塞信号的方法来实现。Linux提供了sigprocmask函数和和sigsuspend函数用于信号的阻塞和挂起。

     

    #include <signal.h>
    
    int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
    int sigsuspend(const sigset_t *mask);

           函数sigprocmask的参数set、oldset指向信号集。set指向一个信号集时,参数how表示sigprocmask函数如何对set所指向的信号集以及信号掩码进行操作。当参数set的值为NULL时,how的取值无效。当oldset不为NULL时,函数将进程当前的信号掩码写入oldset指向的信号集。

    参数how的取值及对应功能
    how对应函数功能
    SIG_BLOCK将set所指向的信号集中所包含的信号加到当前的信号掩码中,即信号掩码与set信号集做逻辑或运算
    SIG_UNBLOCK将set所指向的信号集中所包含的信号从当前的信号掩码中删除
    SIG_SETMASK设定新的当前信号掩码为set所指向的信号集中所包含的信号

            函数sigsuspend的作用是挂起信号。在调用该函数后,进程停止执行,等待着开放信号的唤醒。

    展开全文
  • C语言 信号处理机制

    千次阅读 2016-09-07 09:44:35
    C语言中信号标示一种时间,它可能异步地发生,也就是并不与城市执行过程中的任何...同样可以显示引发一个信号: int raise(int sig); 指定希望采取的措施: void (* signal(int sig, void (* handler) (int) ) )(in


    C语言中信号标示一种时间,它可能异步地发生,也就是并不与城市执行过程中的任何事件保持同步,如果程序中未设置该信号的处理函数,则选择缺省方式---大部分为终止程序运行。

    信号头文件<signal.h>



    同样可以显示引发一个信号: int raise(int sig);

    指定希望采取的措施: void (* signal(int sig, void (* handler) (int)  ) )(int);

    去除返回值来看: signal(int sig, void (* handler) (int) )    参数1:int 型,信号类型 参数2:返回值为void 参数为int,描述想要处理的信号类型,可以为多个或运算结合起来的。

    返回值: void (* signal () )(int)  为该信号以前的处理函数

    另外两个宏作为signal函数的第二个参数, SIG_DFL 恢复对该信号的缺省反应,SIG_IGN使该信号被忽略。

    当信号处理函数处理完成之后,返回触发点。并且在返回之前需要重新调用signal函数重新设置信号处理函数。


    volatile数据:防止以一种可能修改程序含义的方式优化程序。如

    if(A1)

    {

    B1;

    }

    if(A1)

    {

    B2;

    }

    但是程序可能优化为

    if(A1)

    {

    B1;B2;

    }

    但是信号处理函数可能修改A1的值

    展开全文
  • 信号机制」简述Linux信号

    千次阅读 2018-05-20 20:10:54
    工作中再次接触到了Linux信号,以前认为由于离底层比较远,信号没什么用,但这次发现其的一个用途,故打算在此做个简单记录。 信号是操作系统和程序间通信的一种方式,程序监听信号,并在收到信号后按照既定指示进行...
  • Linux信号机制及编程

    千次阅读 2013-08-29 18:15:45
    1965年,荷兰学者Dijkstra提出了利用信号机制解决进程同步问题,信号量正式成为有效的进程同步工具,现在信号机制被广泛的用于单处理机和多处理机系统以及计算机网络中。 信号量S是一个整数,S大于等于零是...
  • 信号在最早的Unix系统中被引入,内核可用信号通知进程系统所发生的事件。在现实生活中,我们每天都在接触信号,下课铃声、红绿灯、闹钟等都是信号信号的本质操作系统给进程发送信号,本质上是给进程的PCB中写入...
  • 深入理解信号机制

    千次阅读 2019-04-04 17:27:36
    原文不可考 ... 深入理解信号槽(一) ...这篇文章来自于 A Deeper Look at Signals and Slots,Scott Collins 2005.12...需要说明的是,我们这里所说的“信号槽”不仅仅是指 Qt 库里面的信号槽,而是站在一个全局的...
  • 该模块提供Python中信号处理的机制,下面是几个常用的方法 1. signal.signal(signalnum, handler) 注册signalnum信号量的处理函数为handler 其中signalnum为待注册的信号量,handler为该信号量的处理器,其是一...
  • Qt中的信号机制详解

    千次阅读 2017-03-29 10:29:07
    Qt中比较有特点的东西也就是信号机制,在讲信号机制之前,我们将说一下Qt中一些比较基础的东西。1、Qt中常用的快捷键 1)、帮助文档的转换,F1可以查看帮助文档,两次F1可以将文档全凭显示
  • Ice笔记--Ice信号处理机制

    千次阅读 2011-09-09 15:04:58
    Ice信号处理机制 概述  信号(signal)是一种进程间通信机制,它给应用程序提供了一种异步的软件中断,使应用程序有机会接受其他程序或者终端发出的命令(信号)。应用程序接收到信号后,一般有三种处理方式...
  • Linux信号机制分析和信号处理函数

    千次阅读 2016-04-20 16:57:53
    【摘要】本文分析了Linux内核对于信号的实现机制和应用层的相关处理。首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理。接着分析了内核对于信号的处理流程包括信号的触发/注册/执行及...
  • 关于Qt中信号机制

    千次阅读 2013-07-23 13:54:40
    Qt用预编译器和宏来保证强大的跨平台能力,信号机制则是其中最精妙之处。本文分析了几种常见的信号处理机制,然后详细介绍了Qt的Signal/Slot机制。  首先要说明,这里所说的信号不是Unix中进程间通信的信号。...
  • QT实现信号与槽机制

    2018-12-10 19:56:47
    用Qt实现信号与槽机制,未使用ui实现窗口的变换和显示
  • QT之信号和槽机制详解

    千次阅读 2019-03-04 21:16:55
    QT之信号和槽机制详解 一、什么是信号和槽机制(signal&amp;slots) QT提供了信号和槽机制用于完成接界面操作的响应,是完成两个任意的QT对象之间的通信机制; 通俗来讲,就是就是一个窗口部件的变化情况要...
  • 【Linux】信号处理机制

    千次阅读 2018-11-10 00:40:29
    Unix早期版本就提供了信号机制,但 不可靠,信号可能丢失 。Berkeley 和 AT&T都对信号模型做了更改,增加了 可靠信号机制 。但 彼此不兼容 。POSIX.1对可靠信号例程进行了标准化。 信号机制 : A给B发送信号,B...
  • 操作系统基础-信号机制的理解

    千次阅读 多人点赞 2019-04-20 13:02:53
    信号机制的提出,是为了解决进程间关系通信的问题,因为进程间不可能用嘴来说“我在使用这个资源啊,你先等我用完再用”,或者说“我用完了,接下来轮到你了!”这是我们人之间通信的方式,那么现实中如何让某个...
  • CAN网关及CAN信号转发机制

    万次阅读 2018-06-04 15:50:34
    CAN网关 及 CAN信号转发机制CAN网关上节课, 我们讲到了CAN网关,其实准确的说不能叫CAN网关, 应该叫网关或者汽车网关, 因为网关不仅处理CAN网络, 还处理LIN网络.主要是为了配合本系列教程及区分于以太网网关, 所以才...
  • 信号与槽机制

    千次阅读 2016-07-31 13:14:45
    QT 的信号与槽机制介绍 信号与槽作为 QT 的核心机制在 QT 编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念、元对象工具以及在实际使用过程中应注意的一些问题。 QT 是一个跨平台...
  • 信号和槽机制

    千次阅读 2016-10-31 16:25:48
    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的...信号和槽机制是 QT 的核心机制,要精通QT编程就必须对信号和槽有所了解。 信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它
  • Qt信号和槽机制

    万次阅读 2017-11-19 16:47:42
    带有默认参数的信号和槽 信号和槽的进一步使用 和第三方库信号槽使用Qt一个小例子一个小的C++类声明如下: class Counter { public: Counter() { m_value = 0; } int value() const { return m_value; } void ...
  • Linux 信号signal处理机制

    千次阅读 2013-12-23 16:23:14
    信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。  信号机制是进程之间相互传递消息的一种方法,信号全称为软...
  • zthread学习 实例十一 信号机制

    千次阅读 2011-06-03 11:26:00
    ZThread库提供了另外一种同步机制——信号量,它定义了两种信号量:Semaphore(带上界) 和 CountingSemaphore(不带上界),都类似于传统的信号量,下面例子说明了其用法:#include "stdafx.h"#include "Display.h"#...
  • Qt信号与槽机制详解

    千次阅读 2014-06-03 10:08:11
    信号和槽机制是Qt的核心机制之一,要掌握Qt编程就需要对信号和槽有所了解。信号和槽是一种高级接口,它们被应用于对象之间的通信,它们是Qt的核心特性,也是Qt不同于其它同类工具包的重要地方之一。 在我们所了解...
  • PySide学习笔记第三章-利用信号机制关闭窗口
  • Android 显示刷新机制、VSYNC和三重缓存机制 为了理解 APP 是如何进行渲染的,我们就必须了解手机硬件是如何工作的,也必须理解什么是 VSYNC。 首先,我们需要了解2个相关概念: 刷新率(Refresh Rate):代表了...
  • QT学习之 信号与槽机制

    千次阅读 2016-04-20 11:44:49
    就我个人来理解,信号机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁。 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 100,637
精华内容 40,254
关键字:

信号显示机制