#include #include #include void die(const char *what) { fprintf(stderr,"Exiting because of a fatal error %s: %s\n", what, strerror(errno)); exit(1); } void *child(void *p) { printf("This is child %d, pid: %d, uid: %d\n", (int) p, getpid(), getuid()); return 0; } int main(int argc, char **argv) { pthread_t tid1,tid2,tid3; void* ret; pthread_create(&tid1, 0, child, (void *)1); /* stevens did this too */ printf("Current pid: %d, current uid: %d\n", getpid(), getuid()); if(setuid(2000)<0) die("setting uid"); printf("uid now: %d\n",getuid()); pthread_create(&tid2, 0, child, (void *)2); pthread_create(&tid3, 0, child, (void *)3); pthread_join(tid1, &ret); pthread_join(tid2, &ret); pthread_join(tid3, &ret); printf("Exiting.\n"); }