pthread_create

Här diskuteras programmering och utveckling
rogga
Inlägg: 3
Blev medlem: 27 dec 2006, 12:09
Ort: Borlänge

pthread_create

Inlägg 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.
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

SV: pthread_create

Inlägg 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 ?
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

SV: pthread_create

Inlägg 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;
} 
Skriv svar

Återgå till "Programmering och webbdesign"