#include #include #include #include #include #include #include #include #include #include /* * valid policy include SCHED_FIFO, SCHED_RR, SCHED_OTHER */ int change_sched(int policy, int priority) { struct sched_param sched_param; sched_param.sched_priority = priority; return sched_setscheduler(0, policy, &sched_param); } void check_realtime(char *prompt) { int sched_policy; struct sched_param sched_param; sched_policy = sched_getscheduler(0); switch (sched_policy) { case SCHED_FIFO: printf("%s: sched policy is SCHED_FIFO.\n", prompt); break; case SCHED_RR: printf("%s: sched policy is SCHED_RR.\n", prompt); break; case SCHED_OTHER: printf("%s: sched policy is SCHED_OTHER.\n", prompt); break; default: printf("error!\n"); exit(-1); } sched_getparam(0, &sched_param); printf("%s: sched priority is %d in the range [%d, %d]\n", prompt, sched_param.sched_priority, sched_get_priority_min(sched_policy), sched_get_priority_max(sched_policy)); } void *SlaveRun (void *t) { printf("slave: run\n"); check_realtime("slave"); return 0; } void check_ret(int flag, char *msg) { if (flag) printf("%s succeeded\n", msg); else printf("%s failed\n", msg); } int main(int argc, char *argv[]) { int ret; pthread_t thread; pthread_attr_t attr; struct sched_param sched_param; check_realtime("master"); ret = change_sched(SCHED_FIFO, 50); if (ret) { printf("Change to SCHED_FIFO at priority 50 faied.\n"); } else { printf("Change to SCHED_FIFO at priority 50 succeeded.\n"); check_realtime("master"); } { printf("create a thread with priority 60 ...\n"); assert(!pthread_attr_init (&attr)); assert(!pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED)); assert(!pthread_attr_setschedpolicy (&attr, SCHED_FIFO)); // assert(!pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED)); sched_param.sched_priority = 60; assert(!pthread_attr_setschedparam (&attr, &sched_param)); ret = pthread_create(&thread, &attr, SlaveRun, (void *) 0); check_ret(ret==0, "master: creating thread"); ret = pthread_cancel (thread); check_ret(ret==0, "pthread_cancel"); ret = pthread_join(thread, NULL); check_ret(ret==0, "pthread_join"); } { printf("create a thread with priority 40 ...\n"); assert(!pthread_attr_init (&attr)); assert(!pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED)); assert(!pthread_attr_setschedpolicy (&attr, SCHED_FIFO)); // assert(!pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED)); sched_param.sched_priority = 40; assert(!pthread_attr_setschedparam (&attr, &sched_param)); ret = pthread_create(&thread, &attr, SlaveRun, (void *) 0); check_ret(ret==0, "master: creating thread"); ret = pthread_cancel (thread); check_ret(ret==0, "pthread_cancel"); ret = pthread_join(thread, NULL); check_ret(ret==0, "pthread_join"); } return 0; }