文章目录
- 八、进程信号
- 3. 信号的处理
- 4. 可重入函数
- 5. volatile
- 未完待续
八、进程信号
3. 信号的处理
当某个信号的处理函数被调用时,操作系统会自动将当前信号假如进程的信号屏蔽字当中。如果处理完该信号,该信号同样也会自动从信号屏蔽字中 移除。该行为的目的是为了防止信号进行嵌套捕捉。
Makefile
testsig:testSig.ccg++ -o $@ $^ -std=c++11
.PHONY:clean
clean:rm -f testsig
testSig
#include <iostream>
#include <signal.h>
#include <unistd.h>
using namespace std;void Print(sigset_t sigset)
{cout << "Pending signals: ";for (int sig = 31; sig >= 1; sig--){if (sigismember(&sigset, sig)) cout << 1;else cout << 0;}cout << endl;
}void handler(int signo)
{cout << "Signal " << signo << endl;sigset_t pending;sigemptyset(&pending);while (true){sigpending(&pending);Print(pending);}
}int main()
{struct sigaction act, oact;act.sa_handler = handler;act.sa_flags = 0;sigemptyset(&act.sa_mask);sigaction(2, &act, &oact);while (true) sleep(1);return 0;
}
4. 可重入函数
可重入函数是指一个函数在多执行流环境下能够正确执行,并且不会产生不可预料的结果或错误。重入的意思是指该函数可以被重复调用,且每次调用都能够独立执行而不会影响其他调用。可重入函数可以保证数据独立性,避免数据混乱。
否则就是不可重入函数。
如下例子:
在上面的情况中,首次调用 insert 函数中,接收到信号捕捉,执行信号自定义处理函数,但是信号自定义处理函数中也调用了 insert 函数,这导致了 node2节点丢失 。这种会出现数据混乱的情况的函数就叫做 不可重入函数 。
5. volatile
volatile关键字的作用可以保证变量的可见性。通俗来讲就是对该变量不进行优化,指从内存中读取。在某些情况下,编译器会进行优化,导致结果不符合我们的预期,因此就需要 volatile 来修饰变量。