/* * Technote Sun 01406 6/24/02: * * open/fopen * * - El numero maximo de ficheros depende del limite "soft", limite * que se puede cambiar usando "ulimit" hasta el maximo fijado por * el limite "hard". * * - Si un proceso usa exclusivamente "open" podra abrir tantos * ficheros como los fijados por el limite soft * * - El limite de 256 para "fopen" en binarios de 32 bits es una * caracteristica de la libreria de stdio, y no se puede hacer nada. * Es comun a todos los Unix, que implementan la tabla de streams * de fopen con 8 bits. * * http://developers.sun.com/solaris/articles/stdio_256.html * * - Hay un invento un tanto raro para que si realmente rembo * usa fopen pueda funcionar. Hay que precargar un objeto dinamico * que proporciona "extended FILE facility". * */ #include #include #include #include void topen(void); void tfopen(void); int main(int argc, char **argv) { struct rlimit rlimit; /* HP-UX defines __LP64__ */ #if defined(_LP64) || defined (__arch64__) || defined (__mips64) || defined (__LP64__) # define ARCH64 1 #endif #ifdef __sgi #if (_MIPS_SZPTR == 64) # define ARCH64 1 #endif #endif #if defined __alpha # define ARCH64 1 #endif #ifdef ARCH64 puts("This is a 64 bits architecture"); #endif if (getrlimit(RLIMIT_NOFILE, &rlimit) == -1) { perror("getrlimit"); } else { printf("File soft limit: %d\n", rlimit.rlim_cur); printf("File hard limit: %d\n", rlimit.rlim_max); } tfopen(); topen(); } void tfopen(void) { FILE *f[65535]; unsigned int i=0; while( NULL != ( f[i] = fopen("/etc/motd", "r"))) { i++; } perror("fopen"); fprintf(stderr,"fopen i=%d\n",i); do { fclose(f[--i]); } while( i != 0 ); } void topen(void) { int f[65535]; unsigned int i=0; while( -1 != ( f[i] = open("/etc/motd", O_RDONLY))) { i++; } perror("open"); fprintf(stderr,"open i=%d\n",i); do { close(f[--i]); } while( i != 0 ); }