Sida 1 av 1

pthread_create

Postat: 08 feb 2007, 10:40
av rogga
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.

SV: pthread_create

Postat: 08 feb 2007, 13:48
av Okänd
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 ?

SV: pthread_create

Postat: 08 feb 2007, 14:29
av Okänd
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:

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, &param);
   printf("policy %d\n",policy);


   pthread_join(thread,(void*)&policy);

   
  return 0;
}