You need to read up on what signal returns. What happens if there is no handler already installed for a signal, or if no handler can be installed?
Your code can crash because in handle you are dereferencing a function pointer without checking its value first.
Here is why not -
The signal() call masked off the default action of the signal. You have to raise() the signal again. This is because once the signal is received, the orignal mask is removed. The only way to get the effect of the signal - if it can be blocked - is to raise() it again.
The big problem is that many signals end up terminating the process one way or another.
So your process will dump core and exit or whatever. It would make more sense to pick up a copy of Steven's 'Advanced UNIX programming' and spend an hour with Chapter 10 on signals. There is a big chart on signals and default actions.
signal() is messy. It puts integers AND function pointers through the same argument and return value. 0 means SIG_DFL, 1 means SIG_IGN, anything else is presumed to be a function pointer. Your array of function pointers is going to be full of SIG_DFL's, which amounts to NULLs.