Nowe posty

xx Dystrybucja pod HP Omen (6)
2024-03-27, 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
lamp Problem z Linux Lite po instalacji (0)
2024-03-27, 19:50:30
xx Ile pingwinów? (1)
2024-03-27, 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: Dostep do systemu Red Hat  (Przeczytany 6846 razy)

Nobody1

  • Gość
Dostep do systemu Red Hat
« dnia: 2005-06-21, 10:21:57 »
Witam!

Mam program, ktory tworzy okreslona ilosc rurek, a nastepnie zapisuje
do losowo wybranej rurki. Nad monitorowaniem stanu deskryptorów czuwa
funkcja select(). Nie wiem jednak dlaczego funkcja select() zwraca 0
tak jakby nic sie nie stalo.

Oto listing...

#include
#include
#include
#include
#include

#define MAXFDS    1000
#define MAXBYTES  1024*1024

fd_set readset;

int pipeArr[MAXFDS][2];
int useSelect = 1;

void fatal(char *str)
{
  printf(\\"%snErrno = %dn\\", str, errno);
  exit(-1);
}

void createPipes(int num)
{
  int i;
  FD_ZERO(&readset);

  for (i = 0; i < num; i++)
    {
      int ret = pipe(pipeArr);
      if (ret < 0) fatal(\\"could not create pipe...check fd limit\\");
       FD_SET(pipeArr[0],&readset);
    }
}

int writeRandom(int num)
{
  char buf[100];
  int index = (int) random() % num;
  if (write(pipeArr[index][1],buf,10) != 10) fatal(\\"could not write to
pipe\\");
  return index;
}

int readData(int num)
{
  int i;
  ssize_t readret;
  char buf[100];
  int totreads=0;

  for (i = 0; i < num; i++)
    {
      if (FD_ISSET(pipeArr[0],&readset))
   {
     if ( (readret = read(pipeArr[0], buf, 10)) <= 0 )
fatal(\\"read() failed\\");
     totreads += readret;
     return totreads;
   }
    }
  return totreads;
}

void writeReadLoops(int num)
{
  struct timeval t1,t2;
  struct timeval t3;

  char buf[100];
  int count=0;
  int reads=0;
  int selectret, readret, pollret, idx;

  puts(\\"Starting write / [select] / read loop:\\");
  gettimeofday(&t1, NULL);
  while ( reads < MAXBYTES )
    {
      idx = writeRandom(num);
      count += 1;
      if (useSelect==1)
   {
     t3.tv_sec = 0;
     t3.tv_usec = 0;

     selectret = select(num+1, &readset, NULL, NULL, &t3);
     if (selectret <= 0) fatal(\\"select() failed\\");
     readret = readData(num);
     if (readret <= 0) fatal(\\"read() failed\\");
   }
      else /* no polling - we know the index! */
   {
     if ( (readret = read(pipeArr[idx][0], buf, 10)) <= 0 )
       fatal(\\"could not read what was just written\\");
   }
      reads += readret;
    }
  gettimeofday(&t2, NULL);
  if (useSelect == 1) printf(\\"%d write()/select()/read()s on %d file
descriptor(s)\\", count,num);
  else printf(\\"%d write()/read()s on %d file descriptor(s)\\",
count,num);

  printf(\\" took : %d msec.n\\", (t2.tv_sec - t1.tv_sec) * 1000 +
    ((t2.tv_usec - t1.tv_usec)/1000));
}

main(int argc, char **argv)
{

  int numFds;

  numFds = atoi(argv[1]);

  createPipes(numFds);
  printf(\\"Opened %d file descriptor(s)n\\", numFds);
  writeReadLoops(numFds);
}

W jaki sposób porawić ten kod ?

xavery

  • Gość
Dostep do systemu Red Hat
« Odpowiedź #1 dnia: 2005-06-21, 10:59:59 »
Nie wiem jednak dlaczego funkcja select() zwraca 0
 > tak jakby nic sie nie stalo.
[ciach]
 >      t3.tv_sec = 0;
 >      t3.tv_usec = 0;
 >
 >      selectret = select(num+1, &readset, NULL, NULL, &t3);

Jak to nic sie nie stalo? Nastapilo przeterminowanie (struktura timeval rowna zeru?) i w takim przypadku, jesli zaden deskryptor nie zaalarmowal selecta (nie ma po prostu na to czasu), wiec select wychodzi ze stanem zerowym.

xavery

  • Gość
Dostep do systemu Red Hat
« Odpowiedź #2 dnia: 2005-06-21, 11:03:57 »
Jeszcze jedno - program zwraca piekna liste bledow i ostrzezen (gcc z opcja -Wall). Dopracuj go troche

Nobody1

  • Gość
Dostep do systemu Red Hat
« Odpowiedź #3 dnia: 2005-06-21, 12:08:04 »
2005-06-21 10:59:59 xavery napisał:

> Nie wiem jednak dlaczego funkcja select() zwraca 0
 >  > tak jakby nic sie nie stalo.
 > [ciach]
 >  >      t3.tv_sec = 0;
 >  >      t3.tv_usec = 0;
 >  >
 >  >      selectret = select(num+1, &readset, NULL, NULL, &t3);
 >
 > Jak to nic sie nie stalo? Nastapilo przeterminowanie (struktura timeval rowna zeru?) i w takim
 > przypadku, jesli zaden deskryptor nie zaalarmowal selecta (nie ma po prostu na to czasu), wiec
 > select wychodzi ze stanem zerowym.
 >
Nic to nie zmienia nawet dla t3.tv_sec=10;

Nobody1

  • Gość
Dostep do systemu Red Hat
« Odpowiedź #4 dnia: 2005-06-21, 12:14:31 »
2005-06-21 11:03:57 xavery napisał:

> Jeszcze jedno - program zwraca piekna liste bledow i ostrzezen (gcc z opcja -Wall). Dopracuj go
 > troche
W porządku... jednak nie mają one wpływu na działanie selecta.

xavery

  • Gość
Dostep do systemu Red Hat
« Odpowiedź #5 dnia: 2005-06-21, 13:43:48 »
>  >
 > Nic to nie zmienia nawet dla t3.tv_sec=10;

No bo i po 10 sekundach select tez wyjdzie z zerem, jesli nie bedzie zadnego deskryptora gotowego do czytania. Przyznam, ze nie wnikalem w tresc programu, ale moze lepiej by bylo gdyby zamiast struktury czasu przekazac NULL. O ile dobrze pamietam, select bedzie czekac do ... konca swiata:)

koniu321

  • Gość
Dostep do systemu Red Hat
« Odpowiedź #6 dnia: 2005-06-20, 22:14:48 »
Mam problem z zalogowanie sie do systemu Red Hat. Zapomnialem haslo roota i nie moge sie zalogowac. Metoda z "linux single" nie dziala! Mam w zwiazku z tym pytanie czy zna ktos inna metode zalogowania sie do systemu i zmieny hasla?
Wiem, ze mozna wyciagnac dysk i podpiac do innego systemu. Jezeli ktos znam program dzieki, ktoremu moza uzyskac dostep do partycji linuxowej z poziomu windowsaXP to rowniez prosilbym o inrofmacje.

Stilgar

  • Gość
Dostep do systemu Red Hat
« Odpowiedź #7 dnia: 2005-06-20, 22:33:12 »
'zapomnialem hasla roota' ... jestes pewny, ze chcesz uzywac linuksa?

do tych partycji mozesz sie dobrac, odpalajac np Knoppiksa

chmooreck

  • Gość
Dostep do systemu Red Hat
« Odpowiedź #8 dnia: 2005-06-20, 22:40:15 »
chroot

reszte sam wykombinuj/poszukaj...