Linux 信号和信号量小记

一,信号函数

1、使用信号需要先注册:注册是让进程知道有这么一个信号,等信号到来时才会调用(类似我们注册网站,注册后在登录的时候才能使用)

注册信号后如何使用就看我们自己的设定了,比如收到信号后结束程序,打印信息等。而何时会调用到子信号。

不过这概念解释有点难接受:一个进程收到一个来自操作系统内核的信号,这个过程称为注册

后面等深入了解后再找材料验证

       #include

       typedef void (*sighandler_t)(int);

       sighandler_t signal(int signum, sighandler_t handler);

2、在程序运行过程中收到信号后会执行信号处理函数

以下案例在收到SIGINT (2)信号后,会将SIGINT信号的值当作参数传给sigFunc函数执行,结果如下

#include 
#include 
#include 
#include 

void sigFunc(int num)            //注册行为对程序无影响,运行后就终止了,现在不会输出内容
{
    printf("argument num = %d\n", num);
}

int main()
{
    void (*retHandler)(int);
    retHandler = signal(SIGINT, sigFunc);
    if(retHandler == SIG_ERR)
    {
        perror("signal() failed for sig_err!");
        _exit(0);
    }
    retHandler = signal(SIGQUIT, sigFunc);   //可同时注册多个信号
    if(retHandler == SIG_ERR)
    {
        perror("signal() failed for sig_err!");
        _exit(0);
    }
    while (1)
    {
        /* code */
    }
    
}

3、此处的sigFunc 便是回调函数

此处的sigFunc便是作为参数传递给signal() 函数,且后面收到信号时进行调用。

Linux 信号和信号量小记_第1张图片

4、调试代码出现段错误/其他生成core 的错误时

1、可以先将core 生成路径改为程序运行的当前路径下

echo “core.%e.%p” > /proc/sys/kernel/core_pattern

(权限不够就需要切换到root权限执行)

2、

5、信号量的问题:

        信号量的相关函数都在以下头文件中。。

        头文件 sys/sem.h  是system V时的信号量库

        semaphore.h 是posix信号量。此信号量可以直接工作在用户空间中,且是轻量级的信号量,可以在多线程中使用。

        信号量的作用可以用来保护资源,或者说是控制对资源的使用。

         Linux 信号和信号量小记_第2张图片

1、信号量的目的是为了保证  不同线程对资源的安全使用,防止多个线程对资源进行并发访问

2、按照自己的理解上,sem_post ()和sem_wait()分别控制的是 资源的可使用数量 增加和减少。(最重要的前提,代码中已经设定了资源,这个资源是什么就看代码设定了

        当可用资源数量大于0时,此时有线程调用资源,就需要使用sem_wait(sem),会自动执行减一的操作,可用资源数量减一(如果线程池中可认为,可使用的线程少了一个),如果此时资源数量为0则会阻塞在此处,表示没有资源可以给我们调用。

        当可用资源数量等于0时,此时只能等待被占用的资源释放后(或者说等占用资源的线程或者任务工作完)调用sem_post(sem)可用资源量加1后。表示此时有了可用资源。则又可以给别的线程调用资源使用,又可以调用sem_wait()。

3、至于有的说会阻塞在sem_post 函数的情况,,还没有发现比较形象的描述,只有一个调用此函数会使一个线程不再阻塞(目前看相当于,调用这个函数会导致可用资源量加一,也就相当于有线程可以调用此资源,所以不会再阻塞

(这么看sem_post 和sem_wait()   颇有点左脚踩右脚梯云纵的感觉)

使用情况来看,比sys/sem.h 信号量的使用简单方便跟多

可以参考下面大佬的介绍,好多年了,很通透

信号量释放和等待函数sem_post()和sem_wait()_sem_post和sem_wait-CSDN博客

你可能感兴趣的:(算法)