Listing 2. The Real-Time Thread in Its Entirety

void *thread_code(void *t)
{
    int taskno = (int) t;
    int fifo = taskno + 1;
    struct my_msg_struct msg;
    int rt_fd, output_fd;
    char name[10];

    msg.command = NOOP; //don't start out with
                        //an action

    sprintf(name,"/dev/rtf%d",fifo);
    rt_fd = open(name, O_NONBLOCK);

    sprintf(name,"/dev/rtf%d",fifo+2);
    output_fd = open(name, O_NONBLOCK);

    pthread_make_periodic_np(pthread_self(),
    gethrtime(), 500000000);

    while (1) {
        pthread_wait_np();
        read(rt_fd,&msg,sizeof(msg));
        switch (msg.command) {
            case HELLO:
                 write(output_fd, "hello ", 6);
                 break;
            case WORLD:
                 write(output_fd, "world ", 6);
                 break;
            case NOOP:
                 continue;
            case STOP:
            default:
                 close(output_fd);
                 close(rt_fd);
                 return 0;
        }
    }
    return 0;
}