Nowe posty

xx Przydatne Linki (4)
Wczoraj o 14:13:00
xx Awstat (0)
2019-08-22, 14:55:15
xx SMB - Access denied z Windows (9)
2019-08-19, 11:27:24
xx Kali Linux - książka. (0)
2019-08-19, 00:20:25
xx Arch - startx dla uruchomienia GNOME powoduje wyłączenie komputera (6)
2019-08-18, 14:37:04
xx Nie moge urchmomic laptopa - grub rescue. (1)
2019-08-17, 18:24:00
xx Po aktualizacji zniknęły niektóre funkcje (45)
2019-08-14, 06:39:01
xx Operacje na bitach. (4)
2019-08-10, 21:44:36
xx Pblem z montowaniem dysku sieciowego (1)
2019-08-09, 23:36:45
xx [Promocja] Mój nowy kanał na YouTube o Linuksie po polsku. (0)
2019-08-07, 20:36:10

Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości -

Strony: [1]
1
Inne / Problem z select()
« 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.

2
Inne / Problem z select()
« 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;

3
Inne / Problem z select()
« 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 ?

4
Administracja / Dostep do systemu Red Hat
« 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.

5
Administracja / Dostep do systemu Red Hat
« 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;

6
Administracja / 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 ?

Strony: [1]