in reply to Re: perl bug? illegal seek with dup and many filehandles
in thread perl bug? illegal seek with dup and many filehandles

Your test works for me on 32 and 64 bit (I originally found the problem using socketpair() :-). The original script also fails for me using perl, v5.8.8 built for i486-linux-gnu-thread-multi. 32bit strace working with 2000 files:
write(1, "opened 2000 files\n", 18opened 2000 files ) = 18 dup2(2004, 1) = 1 close(2004) = 0 fcntl64(1, F_SETFD, 0) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb130d8) = -1 ENOTTY (Inapp +ropriate ioctl for device) _llseek(1, 0, [0], SEEK_CUR) = 0 socketpair(PF_FILE, SOCK_STREAM, 0, [2004, 2005]) = 0 ioctl(2004, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb13258) = -1 EINVAL (In +valid argument) _llseek(2004, 0, 0xbfb132a0, SEEK_CUR) = -1 ESPIPE (Illegal seek) ioctl(2004, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb13258) = -1 EINVAL (In +valid argument) _llseek(2004, 0, 0xbfb132a0, SEEK_CUR) = -1 ESPIPE (Illegal seek) ioctl(2005, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb13258) = -1 EINVAL (In +valid argument) _llseek(2005, 0, 0xbfb132a0, SEEK_CUR) = -1 ESPIPE (Illegal seek) ioctl(2005, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb13258) = -1 EINVAL (In +valid argument) _llseek(2005, 0, 0xbfb132a0, SEEK_CUR) = -1 ESPIPE (Illegal seek) fcntl64(2004, F_SETFD, FD_CLOEXEC) = 0 fcntl64(2005, F_SETFD, FD_CLOEXEC) = 0 ioctl(2005, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb130d8) = -1 EINVAL (In +valid argument) _llseek(2005, 0, 0xbfb13120, SEEK_CUR) = -1 ESPIPE (Illegal seek) fstat64(2005, {st_mode=S_IFSOCK|0777, st_size=0, ...}) = 0 dup2(2005, 1) = 1 dup(2005) = 2006 fcntl64(2005, F_GETFD) = 0x1 (flags FD_CLOEXEC) dup2(2006, 2005) = 2005 fcntl64(2005, F_SETFD, FD_CLOEXEC) = 0 close(2006) = 0 fcntl64(1, F_SETFD, 0) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb130d8) = -1 EINVAL (Inval +id argument) _llseek(1, 0, 0xbfb13120, SEEK_CUR) = -1 ESPIPE (Illegal seek) ioctl(2005, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb13108) = -1 EINVAL (In +valid argument) _llseek(2005, 0, 0xbfb13150, SEEK_CUR) = -1 ESPIPE (Illegal seek) fstat64(2005, {st_mode=S_IFSOCK|0777, st_size=0, ...}) = 0 dup2(2005, 1) = 1 fcntl64(1, F_SETFD, 0) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb130d8) = -1 EINVAL (Inval +id argument) _llseek(1, 0, 0xbfb13120, SEEK_CUR) = -1 ESPIPE (Illegal seek) dup(3) = 2006 ioctl(2006, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb13108) = -1 EINVAL (In +valid argument) _llseek(2006, 0, 0xbfb13150, SEEK_CUR) = -1 ESPIPE (Illegal seek) fstat64(2006, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 dup2(2006, 1) = 1 close(2006) = 0 fcntl64(1, F_SETFD, 0) = 0 close(2005) = 0 ...many more close() calls... close(5) = 0 close(4) = 0 dup(3) = 4 ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb13108) = -1 EINVAL (Inval +id argument) _llseek(4, 0, 0xbfb13150, SEEK_CUR) = -1 ESPIPE (Illegal seek) fstat64(4, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 write(1, "no problem with 2000!\n", 22no problem with 2000!

and the same process failing with 4000 files:
write(1, "opened 4000 files\n", 18opened 4000 files ) = 18 dup2(4004, 1) = 1 close(4004) = 0 fcntl64(1, F_SETFD, 0) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb130d8) = -1 ENOTTY (Inapp +ropriate ioctl for device) _llseek(1, 0, [0], SEEK_CUR) = 0 socketpair(PF_FILE, SOCK_STREAM, 0, [4004, 4005]) = 0 ioctl(4004, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb13258) = -1 EINVAL (In +valid argument) _llseek(4004, 0, 0xbfb132a0, SEEK_CUR) = -1 ESPIPE (Illegal seek) ioctl(4004, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb13258) = -1 EINVAL (In +valid argument) _llseek(4004, 0, 0xbfb132a0, SEEK_CUR) = -1 ESPIPE (Illegal seek) ioctl(4005, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb13258) = -1 EINVAL (In +valid argument) _llseek(4005, 0, 0xbfb132a0, SEEK_CUR) = -1 ESPIPE (Illegal seek) ioctl(4005, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb13258) = -1 EINVAL (In +valid argument) _llseek(4005, 0, 0xbfb132a0, SEEK_CUR) = -1 ESPIPE (Illegal seek) fcntl64(4004, F_SETFD, FD_CLOEXEC) = 0 fcntl64(4005, F_SETFD, FD_CLOEXEC) = 0 ioctl(4005, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb130d8) = -1 EINVAL (In +valid argument) _llseek(4005, 0, 0xbfb13120, SEEK_CUR) = -1 ESPIPE (Illegal seek) fstat64(4005, {st_mode=S_IFSOCK|0777, st_size=0, ...}) = 0 dup2(4005, 1) = 1 dup(4005) = 4006 fcntl64(4005, F_GETFD) = 0x1 (flags FD_CLOEXEC) close(4005) = 0 dup2(4006, 4005) = 4005 fcntl64(4005, F_SETFD, FD_CLOEXEC) = 0 close(4006) = 0 fcntl64(1, F_SETFD, 0) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb130d8) = -1 EINVAL (Inval +id argument) _llseek(1, 0, 0xbfb13120, SEEK_CUR) = -1 ESPIPE (Illegal seek) open("/usr/share/locale/locale.alias", O_RDONLY) = 4006 fstat64(4006, {st_mode=S_IFREG|0644, st_size=2582, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, + 0) = 0xb7fc8000 read(4006, "# Locale name alias data base.\n#"..., 4096) = 2582 read(4006, "", 4096) = 0 close(4006) = 0 munmap(0xb7fc8000, 4096) = 0 open("/usr/share/locale/en_GB.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = +-1 ENOENT (No such file or directory) open("/usr/share/locale/en_GB.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = - +1 ENOENT (No such file or directory) open("/usr/share/locale/en_GB/LC_MESSAGES/libc.mo", O_RDONLY) = 4006 fstat64(4006, {st_mode=S_IFREG|0644, st_size=1474, ...}) = 0 mmap2(NULL, 1474, PROT_READ, MAP_PRIVATE, 4006, 0) = 0xb7fc8000 close(4006) = 0 open("/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = 4006 fstat64(4006, {st_mode=S_IFREG|0644, st_size=21568, ...}) = 0 mmap2(NULL, 21568, PROT_READ, MAP_SHARED, 4006, 0) = 0xb7cdc000 close(4006) = 0 futex(0xb7f87dec, FUTEX_WAKE, 2147483647) = 0 open("/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 +ENOENT (No such file or directory) open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 E +NOENT (No such file or directory) open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT + (No such file or directory) write(2, ">&= fd - Illegal seek at lotsoff"..., 49>&= fd - Illegal see +k at lotsoffiles.pl line 23. ) = 49