Very good job. A few points.

Technically, handler_flag should be of type sig_atomic_t:
static volatile sig_atomic_t handler_flag = 0;

Instead of initializing num_hijos and menu in main, initialize them first thing in catch_getopt.

In catch_getopt, you don't need to cast *num_hijos to int (it's already an int). And instead of just testing if it's 0, you should check if it's <= 0 since the user could enter a negative number.

parsear should return a boolean (int with value 0 or 1), not an int*. That would express the point of the return value more clearly. (Especially if you included stdbool.h and used a bool with true and false.)

You should put an exit(0) after the esperar_signal(i) call to ensure that no child continues past that point. (I realize that esperar_signal has an infinte loop, but it's still good practice and allows the reader of the code to see right away that the child will not continue after that point.)

In crear_hijos you "verify that the children come from the same parent" but I don't see how it could be otherwise. That check is not needed.

Likewise in pedir_signal, I don't see how any process but the original parent could possibly be running that code (especially if you add the exit that I mentioned before).

Your comment says you are "increasing" the flag when you are actually decremeting it:
handler_flag--;
Simply setting it to 0 would be clearer (it's essentially boolean). Also, when we test boolean values, we don't usually say if (handler_flag == 1). Instead we just say if (handler_flag)

In parsear, you shouldn't use a loop to strtok the values. What if the user entered 3 or more values? Your code would keep reading them into successive positions of input (which only has 2 positions allocated). Actually, strtok is not really appropriate here. I would just use sscanf
sscanf(entrada, "%d - %d", input, input+1);

In esperar_signal, you don't use the parameter n. Maybe you want to print it out along with the pid ("I am child 3 (pid 1234) ...").

To get gcc (or c99) to tell you about unused variables AND unused parameters, you need to give both the -Wall flag and the -W flag (which is also called -Wextra).

I don't understand what the fork() in esperar_signal is supposed to do. That child (of a child) will be alone in the wilderness and will not be able to be communicated with by the original parent (or even the child that created it). It just waits for a signal that will never come.