#include #include #include #include #include #include #include #include #include #include #include #include #define THREAD_NUM 5 static void printprio(const char *pfx) { int prio; pid_t tid = syscall(SYS_gettid); pid_t pid = getpid(); prio = getpriority(PRIO_PROCESS, tid); printf("%sTID:%d getpriority:%d\n", pfx, tid, prio); prio = getpriority(PRIO_PROCESS, pid); printf("%sPID:%d getpriority:%d\n", pfx, pid, prio); } int threadno; static void* threadfunc(void *dummy) { sleep(1); /* wait for parent to setpriority */ setpriority(3 /*PRIO_THREAD*/, syscall(SYS_gettid), -(++threadno)); setpriority(PRIO_PROCESS, syscall(SYS_gettid), -(++threadno)); printprio("THREAD CHILD: "); pthread_exit(0); } int main() { pid_t pid = fork(); if (pid) { /* parent */ int status; printf("start test program\n"); sleep(1); /* wait for threads to start in child */ printf("setpriority(PRIO_PROCESS, %d, -10)\n", pid); if (setpriority(PRIO_PROCESS, pid, -10) < 0) { perror("setpriority PRIO_PROCESS"); exit(1); } wait(&status); } else { /* child */ int i; pthread_t thread_id[THREAD_NUM]; printprio("CHILD1: "); for (i = 1; i < THREAD_NUM; i++) { usleep(30*1000); pthread_create(&thread_id[i], NULL, &threadfunc, NULL); } usleep(30*1000); sleep(1); /* wait for parent to setpriority */ printprio("CHILD2: "); for (i = 1; i < THREAD_NUM; i++) { pthread_join(thread_id[i], NULL); printf("Joined!\n"); } } return 0; }