#include #include #include #include #include #include #include void run_test(int maxfd) { int srcfd = STDERR_FILENO; int minfd = 1024; /* Linux kernel expands the file descriptor table exponentially, so * keep requesting a minimum file descriptor exponentially. */ for ( ; minfd < maxfd; minfd *= 2) { int fd; do { fd = fcntl(srcfd, F_DUPFD, minfd); } while (fd == -1 && errno == EINTR); if (fd == -1) { if (errno != EMFILE) perror("fcntl"); return; } close(fd); } } int main(int argc, char **argv) { struct rlimit lim; if (argc > 1) { lim.rlim_max = lim.rlim_cur = strtol(argv[1], NULL, 0); } else { int n; FILE *f = fopen("/proc/sys/fs/nr_open","r"); if (!f) { perror("fopen"); return EXIT_FAILURE; } if (fscanf(f, "%d", &n) != 1) return EXIT_FAILURE; fclose(f); lim.rlim_max = lim.rlim_cur = n; } if (setrlimit(RLIMIT_NOFILE, &lim) == -1) { perror("setrlimit"); return EXIT_FAILURE; } run_test(lim.rlim_cur); static const char msg[] = "success\n"; int ok1 = write(STDOUT_FILENO, msg, strlen(msg)) == strlen(msg); return ok1 ? EXIT_SUCCESS : 255; }