¿Por qué no hay salida en la consola en el manejo de la señal?

Estaba probando este programa de Programación Avanzada en Unix Environment.

#include<stdio.h>
#include<signal.h>

static void handler(int sig){
    if(sig == SIGUSR1)
        printf("handled user1 signal");
    else if(sig == SIGUSR2)
        printf("handles user2 signal");
    else
        printf("unkown signal");
}

int main(){

    if(signal(SIGUSR1, handler) == SIG_ERR)
        printf("can't handle signal SIGUSR1");
    if(signal(SIGUSR2, handler) == SIG_ERR)
        printf("can't handle signal SIGUSR2");
    for(;;)
        pause();
    return 0;
}

Estoy usando Ubuntu 11.10. Compilo el programa con gcc y luego ejecuto a.out como se indica en el libro.

$. / a.out & [1] + 1345

$ kill -USR1 1345

Pero no hay salida impresa. El programa se sigue ejecutando en backgound y tengo que matarlo.

Otras cosas que he probado:

Intenté manejar SIGINT para ver si la ejecución del programa en segundo plano está causando problemas. Todavía no hay salida.

Descargué la última versión de FreeBSD y probé el mismo programa, pero con el mismo problema.

Puse una declaración printf antes de configurar el manejador de señal:

int main(){
    printf("printf is working...");
    //exit(0);
    if(signal(SIGUSR1, handler) == SIG_ERR)
    ...

cuando se comenta exit (), no hay salida. Cuando lo descomente, se imprime la salida.

Por favor, dime, ¿qué estoy haciendo mal en esto?

PD: No sugieras utilizar sigaction (). Estoy aprendiendo programación de Unix, no construyendo ninguna aplicación práctica.

Respuestas a la pregunta(1)

Su respuesta a la pregunta