[ Dejan Lozanovic @ 27.05.2003. 22:05 ] @
Jel ima neka dobra dusa koja koristi neki BSD da iskompajlira i pokrene ovaj primer. Program sve sto vraca jeste maksimalan moguci broj otvorenih fajlova.... I da jos usput kaze koju verziju BSD-a koristi.

Code:

#include <unistd.h>
#include <stdio.h>

int main(){
  printf("sysconf: %d\n",sysconf(_SC_OPEN_MAX));
  return 0;
}
[ B o j a n @ 27.05.2003. 23:02 ] @
dobradusa:

Code:

$ gdb test
warning: failed to install memory consistency checks; configuration should define NO_MMCHECK or MMCHECK_FORCE
GNU gdb 4.16.1
Copyright 1996 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-unknown-openbsd3.2"...
(gdb) run
Starting program: /tmp/test

Program received signal SIGSEGV, Segmentation fault.
0x0 in ?? () at test.c:4
4
(gdb)


Code:

uname -a
OpenBSD marge.simpsons.net.yu 3.2 MARGE#12 i386
[ Dusan Marjanovic @ 27.05.2003. 23:44 ] @
sysconf: 3636

4.8-STABLE FreeBSD
[ papak @ 28.05.2003. 00:04 ] @
volta% ./a.out
sysconf: 3636
volta% uname -a
FreeBSD volta.tazznetworks.com 5.0-RELEASE-p7 FreeBSD 5.0-RELEASE-p7 #3: Wed May 14 15:44:16 EDT 2003 [email protected]:/usr/obj/home/idb/src/bsd/50/src/sys/VOLTA i386
volta%
[ Dejan Lozanovic @ 28.05.2003. 13:29 ] @
Simpa :))) lepo sam iznenadjen :)))) vrednostima :))) linux dozvoljava samo 1024 fajla da se otvore :)) ne znam samo kako im je izletelo da bash bude cifra 3636 a ne neki stepen dvojke :)))

Mada opet mi nije jasno kako ovo nije htelo da radi na openBSD-u kod bojana. ovo je nesto najjednostavnije.
[ tOwk @ 28.05.2003. 13:43 ] @
Evo ti moje pretpostavke „zašto“.

POSIX sve ove *_MAX stvari definiše kao:
Ukoliko je definisan *_MAX, onda on predstavlja najveći broj *“.

Znam da bar GNU/Hurd nema takva ograničenja (najčešća greška je da ljudi pretpostave da je PATH_MAX definisan), pa gomila programa sadrži takvu grešku.

Ukoliko ova promenljiva nije definisana, onda nema ograničenja broja otvorenih fajlova, dužine putanje i slično, osim realnog ograničenja memorije.

Znači, ako ne radi na nekom sistemu, onda je taj sistem kvalitetniji :-P
[ rivan @ 30.05.2003. 23:56 ] @
deluje mi malo cudno da prodje prevodjenje, a program pukne sa segmentation faultom ako ta konstanta nije definisana?

Pogledah i man za sysconf na FreeBSDu 4.4 i na nekom linuxu i interesantna je razlika u objasnjenju za _SC_OPEN_MAX:
FreeBSD manual kaze da je to maksimalan otvoren broj fajlova po user id-u
Linux manual kaze da je to maksimalan otvoren broj fajlova po procesu

???
uzgred kod mene programce vraca 4136 (FreeBSD 4.4) sto znaci da je to moguce podesavati u kernelu (meni je povecan broj usera), i te vrednosti mogu da se vide i sa "sysctl kern.maxfiles" i kern.maxfilesperproc (sto sugerise da je manual netacan...)
[ BORG @ 31.05.2003. 16:09 ] @
$ ./a.out
sysconf: 64
$

OpenBSD 3.3.
[ Dejan Lozanovic @ 02.06.2003. 15:07 ] @
Citat:
tOwk:
Evo ti moje pretpostavke „zašto“.

POSIX sve ove *_MAX stvari definiše kao:
Ukoliko je definisan *_MAX, onda on predstavlja najveći broj *“.

Znam da bar GNU/Hurd nema takva ograničenja (najčešća greška je da ljudi pretpostave da je PATH_MAX definisan), pa gomila programa sadrži takvu grešku.

Ukoliko ova promenljiva nije definisana, onda nema ograničenja broja otvorenih fajlova, dužine putanje i slično, osim realnog ograničenja memorije.

Znači, ako ne radi na nekom sistemu, onda je taj sistem kvalitetniji :-P

Pa ne bih se slozio u uvom slucaju za OPEN_MAX, jer ti fajlove otvaras sistemskim pozivom open a on vraca int, tako da u najboljem slucaju na 32 bitnoj arhitekturi je 32767. E sada ovo programce je u skladu sa posixom pa ako to sistem ne moze da iskompajlira onda je los znak jer nije 100% posix kompatibilan.
[ tOwk @ 02.06.2003. 15:48 ] @
Prvo da skrenem pažnju na važnu stvar: na 32-bitnim arhitekturama je int 32-bitni, a to znači opseg -2147483647 do 2147483648 (tj. isto koliko može memorije da se pokrije, pošto je najčešće 32-bitni sistem takav da koristi i 32-bitne pokazivače) — ovo je sigurno slučajna greška.

Citiraću http://www.opengroup.org/onlin...edefs/limits.h.html#tag_13_24:
Citat:
Runtime Invariant Values (Possibly Indeterminate)

A definition of one of the symbolic names in the following list shall be omitted from <limits.h> on specific implementations where the corresponding value is equal to or greater than the stated minimum, but is unspecified.

This indetermination might depend on the amount of available memory space on a specific instance of a specific implementation. The actual value supported by a specific instance shall be provided by the sysconf() function.


Takođe, open() poziv zaista vraća „int“, ali najčešće njegov opseg pokriva svu raspoloživu memoriju na računaru, tj. ograničenje je u tom slučaju je hardver, a ne operativni sistem (kao što sam već i rekao).

Uz to, na http://www.opengroup.org/onlinepubs/007904975/functions/open.html piše:
Citat:
The open() function shall return a file descriptor for the named file that is the lowest file descriptor not currently open for that process. The open file description is new, and therefore the file descriptor shall not share it with any other process in the system.


Eto, znači, moguće je da ti uz svaki pojedinačni proces otvoriš onoliko fajlova koliko opseg int-a omogućava, ako to OS dozvoljava.


Ovaj program jeste POSIX kompatibilan, jer prema http://www.opengroup.org/onlin...7904975/functions/sysconf.html treba da bude vraćena vrednost -1 u slučaju da ograničenja nema, bez menjanja errno promenljive.

To je ono što sam mislio pod „ne radi“.


Usput, POSIX definicija OPEN_MAX-a je:
Citat:

{OPEN_MAX}
Maximum number of files that one process can have open at any one time.
Minimum Acceptable Value: {_POSIX_OPEN_MAX}

što bi moglo da znači da FreeBSD (ako je rivan ispravno izneo) nije POSIX kompatibilan ;-)
[ Dejan Lozanovic @ 02.06.2003. 18:02 ] @
Da bio je lapsus i to zesci :)) svi znamo koliko je 2^32 :)

Sto se ovog drugog tice, mene je tu zabrinulo sto je bojanu pukao program :)) zato sam rekao da mi tu nesto smrdi :)) a sto se frebsd-a tice mislim da je to ipak greska u manualu :), u protivnom necu da kazem sta mislim o FreeBSD-u u tom slucaju da ne bi poceo neki opasan flejm :)
[ rivan @ 04.06.2003. 22:16 ] @
napisah kako se zovu sistemske promenljive koje imaju veze sa _OPEN_MAX:
kern.maxfiles - maksimalan otvoren broj fajlova na sistemu
kern.maxfilesperproc - maksimalan otvoren broj fajlova po procesu

(ovo je u manualu za sysctl sistemski poziv valjda), tako da je ono ocigledno greska na drugom mestu u manualu (mozda je ispravljena u novijim verzijama?)
Inace root moze obe vrednosti da menja u toku rada (bez kompajliranja kernela i sl.)