Twoje PC  
Zarejestruj się na Twoje PC
TwojePC.pl | PC | Komputery, nowe technologie, recenzje, testy
B O A R D
   » Board
 » Zadaj pytanie
 » Archiwum
 » Szukaj
 » Stylizacja

 
M E N U
  0
 » Nowości
0
 » Archiwum
0
 » Recenzje / Testy
0
 » Board
0
 » Rejestracja
0
0
 
Szukaj @ TwojePC
 

w Newsach i na Boardzie
 
OBECNI NA TPC
 
 » PeKa 06:38
 » cVas 06:33
 » NimnuL 06:15
 » NWN 05:07
 » Shark20 02:49

 Dzisiaj przeczytano
 41103 postów,
 wczoraj 25974

 Szybkie ładowanie
 jest:
włączone.

 
ccc
TwojePC.pl © 2001 - 2024
A R C H I W A L N A   W I A D O M O Ś Ć
    

[Wątki][C++] Dziś dla odmiany pytanie o semafory , Barts_706 19/06/08 14:15
A więc tak, po kolei. Kawałek kodu:

const int PROJ_ID = 213;
std::string pPath(getenv ("TMP"));
pPath = pPath + "/server.ctrl.file";
std::cout << pPath << std::endl ;
const char *semFileName = pPath.c_str() ;

FILE *myFile = fopen(semFileName, "w");
fclose(myFile);
key_t my_key = ftok(semFileName, PROJ_ID);
log << my_key << LOG_ENDLINE;

int semSetId = semget(my_key, 1, O_RDWR | IPC_CREAT);
// int semSetId = semget(my_key, 1, 0666 | IPC_CREAT);
// to też próbowałem
log << semSetId << LOG_ENDLINE;

semctl(semSetId, 0, SETVAL, 0);

if (semSetId == -1)
{
log << "Unable to create semaphore set." << LOG_ENDLINE;
}

log << "Trying to sync on semaphore." << LOG_ENDLINE;
struct sembuf semBuf[2];
semBuf[0].sem_num = 0;
semBuf[0].sem_op = 0;
semBuf[0].sem_flg = SEM_UNDO;

semBuf[1].sem_num = 0;
semBuf[1].sem_op = 1;
semBuf[1].sem_flg = SEM_UNDO;

if ( semop(semSetId, semBuf, sizeof(semBuf) / sizeof(semBuf[0])) != 0 )
{
log << "Unable to set up semaphore." << LOG_ENDLINE;
perror("semop");
}
else
{ coś tam robimy

No i niestety wynik taki:

/tmp/server.ctrl.file
06-19 07:10:39 [409ff970] INFO -721272347
06-19 07:10:39 [409ff970] INFO 262149
06-19 07:10:39 [409ff970] INFO Trying to sync on semaphore.
06-19 07:10:39 [409ff970] INFO Unable to set up semaphore.
semop: Permission denied

Ktoś wie czemu? Semctl jest, uprawnienia były nadane, a semafor nie bangla.

Jeśli ktoś się zna trochę na programowaniu wielowątkowym, to będę wdzięczny za wsparcie.

_______________________________

http://jawnesny.pl

  1. hmm , recydywista 19/06/08 14:44
    semctl(semSetId, 0, SETVAL, 0); - ostatnim argumentem nie powinna być unia semun ?
    tablica semBuf wygląda podejrzanie, najpierw czekasz na zero (po co, chyba domyślnie senval jest równe 0) ?
    Wygląda na to że proces nie ma uprawnień do semaforu. upewnij się że ten semafor jest utworzony od nowa. Spróbuj int semSetId = semget(my_key, 1, O_RDWR | IPC_CREAT | IPC_EXCL);
    Adekwatny kawałek mana:
    If sem_op is a positive integer, the operation adds this value to the semaphore value
    (semval). Furthermore, if SEM_UNDO is specified for this operation, the system updates
    the process undo count (semadj) for this semaphore. This operation can always proceed
    &#8212; it never forces a process to wait. The calling process must have alter permission on
    the semaphore set.

    Computers are useless. They can only
    give you
    answers.

    1. dzięki , Barts_706 19/06/08 15:36
      potestuję

      _______________________________

      http://jawnesny.pl

  2. btw , recydywista 19/06/08 16:17
    jakiego loggera używasz ? i czy jest thread-safe ?

    Computers are useless. They can only
    give you
    answers.

    1. zmodyfikowany log4cpp , Barts_706 19/06/08 16:24
      jest oki

      _______________________________

      http://jawnesny.pl

  3. hmm , waski 19/06/08 16:34
    Nie byloby wygodniejsze skorzystanie z gotowych bibliotek do tego dostepnych w boost?
    Poki co wszystko z czego zdarzylo mi sie uzywac z boosta bylo naprawde wygodne, ale semaforami sie nie bawilem jeszcze :)

    SNAFU
    Situation Normal, All Fucked Up

    1. hmm , recydywista 19/06/08 16:47
      a próbowałeś użyc BGL (boost graph library) ? bo jak dla mnie to jest po prostu nieużywalne :)

      Computers are useless. They can only
      give you
      answers.

    
All rights reserved ® Copyright and Design 2001-2024, TwojePC.PL