#include #include #include #include #include #include #include #define NUM_TASKS 5 #define PARENT_PRIO 10 /* Parent's rt priority */ static void child_yielder(int rt_prio); int main (int argc, char **argv) { struct sched_param sp; pid_t child; int i = 0; memset (&sp, 0, sizeof sp); sp.sched_priority = PARENT_PRIO; if (sched_setscheduler (0, SCHED_FIFO, &sp) != 0) { perror("sched_setscheduler()"); exit (1); } for (i = 1; i <= NUM_TASKS; i++) { child = fork(); switch (child) { case 0: /* Child */ /* Child has lower rt priority than parent */ child_yielder(PARENT_PRIO + i); break; case -1: /* Error */ perror("fork()"); kill(0, SIGTERM); break; default: /* Parent */ printf ("Parent: craete child pid %d\n", child); break; } } printf("-- Parent END --\n"); /* Exit and leave child processes running */ /* kill(0, SIGTERM); */ return 0; } static void child_yielder(int rt_prio) { struct sched_param sp; printf ("Child running: pid = %d\n", getpid()); memset (&sp, 0, sizeof sp); sp.sched_priority = rt_prio; if (sched_setscheduler (0, SCHED_FIFO, &sp) != 0) { perror("sched_setscheduler()"); exit (1); } while (1) { sched_yield(); } }