Testar att köra pthread_create med olika "skeduleringar" och det går bra att köra SCHEDULE_RR och SCHEDULE_FIFO som vanlig användare. Det borde väl inte gå att göra eller är det på ett annat vis med rättigheterna i UBUNTU ?
Läser en kurs där läraren också gjort ett program som skapar trådar och det programmet går också bra att köra med olika policyns som vanlig användare.Borde väl bara vara SCHEDULE_OTHER som skall fungera.
pthread_create
SV: pthread_create
Man ska inte kunna köra det om man inte är superanvändare.
Är det inte bara så att du inte kollar returvärdet på pthread_attr_init / pthread_attr_setschedparam ?
Är det inte bara så att du inte kollar returvärdet på pthread_attr_init / pthread_attr_setschedparam ?
SV: pthread_create
Jag gjorde ett litet testprogram, verkar som det är en bugg i pthread.
pthread_attr_setschedpolicy verkar inte returnera nån felkod när man försöker sätta den till en "förbjuden" policy. Dock så uppdateras inte policyn. Men det som är riktigt udda är att när jag kör det som super-user så får jag exakt samma output:
pthread_attr_setschedpolicy verkar inte returnera nån felkod när man försöker sätta den till en "förbjuden" policy. Dock så uppdateras inte policyn. Men det som är riktigt udda är att när jag kör det som super-user så får jag exakt samma output:
Kod: Markera allt
output med vanlig användare
>./threads
policy:0
policy:1
policy:2
normal:0 fifo 1 round robin 2
pthread_create: Success
policy 0
test
output med super-user
> sudo ./threads
Password:
policy:0
policy:1
policy:2
normal:0 fifo 1 round robin 2
pthread_create: Success
policy 0
test
Kod: Markera allt
/*kompilera med gcc -lpthread -Wall -std=c99 threads.c -o threads */
#include <pthread.h>
#include <stdio.h>
#include <errno.h>
void *meep(void *args) {
printf("test\n");
return NULL;
}
int main(int argc, char **argv) {
pthread_attr_t attr;
pthread_t thread;
int policy;
struct sched_param param;
pthread_attr_init(&attr);
pthread_attr_getschedpolicy(&attr,&policy);
printf("policy:%d\n",policy);
if((pthread_attr_setschedpolicy(&attr, SCHED_FIFO)) == ENOTSUP)
fprintf(stderr,"kan inte köra fifo (inte super-user)\n");
pthread_attr_getschedpolicy(&attr,&policy);
printf("policy:%d\n",policy);
if((pthread_attr_setschedpolicy(&attr, SCHED_RR)) == ENOTSUP)
fprintf(stderr,"kan inte köra round robin (inte super-user)");
pthread_attr_getschedpolicy(&attr,&policy);
printf("policy:%d\n",policy);
printf("normal:%d fifo %d round robin %d\n"
,SCHED_OTHER, SCHED_FIFO, SCHED_RR);
if(pthread_create(&thread,&attr,meep,NULL) == 0) {
perror("pthread_create");
}
pthread_getschedparam(thread, &policy, ¶m);
printf("policy %d\n",policy);
pthread_join(thread,(void*)&policy);
return 0;
}