文章目录
- 八、进程信号
- 3. 信号的处理
- 4. 可重入函数
- 5. volatile
- 未完待续
八、进程信号
3. 信号的处理
当某个信号的处理函数被调用时,操作系统会自动将当前信号假如进程的信号屏蔽字当中。如果处理完该信号,该信号同样也会自动从信号屏蔽字中 移除。该行为的目的是为了防止信号进行嵌套捕捉。
Makefile
testsig:testSig.cc
g++ -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 来修饰变量。