Front page | perl.perl5.porters |
Postings from January 2005
[perl #33769] File::Temp::tempdir(CLEANUP=>1) broken when forking
Thread Next
From:
Daniel Macks
Date:
January 12, 2005 03:44
Subject:
[perl #33769] File::Temp::tempdir(CLEANUP=>1) broken when forking
Message ID:
rt-3.0.11-33769-105541.8.59233924008095@perl.org
# New Ticket Created by Daniel Macks
# Please include the string: [perl #33769]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org/rt3/Ticket/Display.html?id=33769 >
This is a bug report for perl from dmacks@netspace.org,
generated with the help of perlbug 1.35 running under perl v5.8.5.
-----------------------------------------------------------------
[Please enter your report here]
File::Temp::tempdir() implements the CLEANUP option by setting an END
block to recursively delete the dir. If the process then forks, both
parent and child have that END, and so it runs when either parent or
child exit. That means when the child ends, it deletes the parent's
tempdir. Test case:
my $dir = File::Temp::tempdir(CLEANUP=>1);
printf "start: %s\n", (-d $dir ? "Y" : "N");
if (not open(KID, "-|")) {
printf "child: %s\n", (-d $dir ? "Y" : "N");
exit;
} else {
while (<KID>) {
print; # spool child's STDOUT to parent's
}
printf "later: %s\n", (-d $dir ? "Y" : "N");
}
gives me:
start: Y
child: Y
later: N
under File::Temp 0.14 (part of core, and latest in CPAN).
Neither this effect (children can delete parent's or sibling's
tempdir) nor the implementation of CLEANUP is documented in the POD.
Proposed solution: the underlying _deferred_unlink() function could
store the current pid along with the dirname, and the END would only
delete if the pid were the same.
Maintainer emailed 2 weeks ago, no response.
[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags:
category=library
severity=medium
---
This perlbug was built using Perl v5.8.5 in the Red Hat build system.
It is being executed now by Perl v5.8.5 - Fri Aug 27 14:46:14 EDT 2004.
Site configuration information for perl v5.8.5:
Configured by Red Hat, Inc. at Fri Aug 27 14:46:14 EDT 2004.
Summary of my perl5 (revision 5 version 8 subversion 5) configuration:
Platform:
osname=linux, osvers=2.6.7-1.499smp, archname=x86_64-linux-thread-multi
uname='linux thor.perf.redhat.com 2.6.7-1.499smp #1 smp wed jul 28 12:34:13 edt 2004 x86_64 x86_64 x86_64 gnulinux '
config_args='-des -Doptimize=-O2 -g -pipe -m64 -Dversion=5.8.5 -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dinstallprefix=/usr -Dprefix=/usr -Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 -Dprivlib=/usr/lib/perl5/5.8.5 -Dsitelib=/usr/lib/perl5/site_perl/5.8.5 -Dvendorlib=/usr/lib/perl5/vendor_perl/5.8.5 -Darchlib=/usr/lib64/perl5/5.8.5/x86_64-linux-thread-multi -Dsitearch=/usr/lib64/perl5/site_perl/5.8.5/x86_64-linux-thread-multi -Dvendorarch=/usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi -Darchname=x86_64-linux -Dvendorprefix=/usr -Dsiteprefix=/usr -Duseshrplib -Dusethreads -Duseithreads -Duselargefiles -Dd_dosuid -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Dinc_version_list=5.8.4 5.8.3 5.8.2 5.8.1 5.8.0'
hint=recommended, useposix=true, d_sigaction=define
usethreads=define use5005threads=undef useithreads=define usemultiplicity=define
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=define use64bitall=define uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBUGGING -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm',
optimize='-O2 -g -pipe -m64',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBUGGING -fno-strict-aliasing -pipe -I/usr/local/include -I/usr/include/gdbm'
ccversion='', gccversion='3.4.1 20040815 (Red Hat 3.4.1-9)', gccosandvers=''
intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
alignbytes=8, prototype=define
Linker and Libraries:
ld='gcc', ldflags =''
libpth=/usr/local/lib64 /lib64 /usr/lib64
libs=-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc
perllibs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
libc=/lib/libc-2.3.3.so, so=so, useshrplib=true, libperl=libperl.so
gnulibc_version='2.3.3'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E -Wl,-rpath,/usr/lib64/perl5/5.8.5/x86_64-linux-thread-multi/CORE'
cccdlflags='-fPIC', lddlflags='-shared'
Locally applied patches:
---
@INC for perl v5.8.5:
/home/dmacks/lib/perl5/site_perl/5.8.5/x86_64-linux-thread-multi
/home/dmacks/lib/perl5/site_perl/5.8.5
/home/dmacks/lib/perl5/site_perl/x86_64-linux-thread-multi
/home/dmacks/lib/perl5/site_perl/5.8.4
/home/dmacks/lib/perl5/site_perl/5.8.3
/home/dmacks/lib/perl5/site_perl/5.8.2
/home/dmacks/lib/perl5/site_perl/5.8.1
/home/dmacks/lib/perl5/site_perl/5.8.0
/home/dmacks/lib/perl5/site_perl
/home/dmacks/lib64/perl5/5.8.5/x86_64-linux-thread-multi
/home/dmacks/lib64/perl5/5.8.5
/home/dmacks/lib64/perl5/x86_64-linux-thread-multi
/home/dmacks/lib64/perl5/5.8.4
/home/dmacks/lib64/perl5/5.8.3
/home/dmacks/lib64/perl5/5.8.2
/home/dmacks/lib64/perl5/5.8.1
/home/dmacks/lib64/perl5/5.8.0
/home/dmacks/lib64/perl5
/usr/lib64/perl5/5.8.5/x86_64-linux-thread-multi
/usr/lib/perl5/5.8.5
/usr/lib64/perl5/site_perl/5.8.5/x86_64-linux-thread-multi
/usr/lib64/perl5/site_perl/5.8.4/x86_64-linux-thread-multi
/usr/lib64/perl5/site_perl/5.8.3/x86_64-linux-thread-multi
/usr/lib64/perl5/site_perl/5.8.2/x86_64-linux-thread-multi
/usr/lib64/perl5/site_perl/5.8.1/x86_64-linux-thread-multi
/usr/lib64/perl5/site_perl/5.8.0/x86_64-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.5
/usr/lib/perl5/site_perl/5.8.4
/usr/lib/perl5/site_perl/5.8.3
/usr/lib/perl5/site_perl/5.8.2
/usr/lib/perl5/site_perl/5.8.1
/usr/lib/perl5/site_perl/5.8.0
/usr/lib/perl5/site_perl
/usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi
/usr/lib64/perl5/vendor_perl/5.8.4/x86_64-linux-thread-multi
/usr/lib64/perl5/vendor_perl/5.8.3/x86_64-linux-thread-multi
/usr/lib64/perl5/vendor_perl/5.8.2/x86_64-linux-thread-multi
/usr/lib64/perl5/vendor_perl/5.8.1/x86_64-linux-thread-multi
/usr/lib64/perl5/vendor_perl/5.8.0/x86_64-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.5
/usr/lib/perl5/vendor_perl/5.8.4
/usr/lib/perl5/vendor_perl/5.8.3
/usr/lib/perl5/vendor_perl/5.8.2
/usr/lib/perl5/vendor_perl/5.8.1
/usr/lib/perl5/vendor_perl/5.8.0
/usr/lib/perl5/vendor_perl
.
---
Environment for perl v5.8.5:
HOME=/home/dmacks
LANG=POSIX
LANGUAGE (unset)
LD_LIBRARY_PATH (unset)
LOGDIR (unset)
PATH=/home/dmacks/bin:/usr/kerberos/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/bin/games:.
PERL5LIB=/home/dmacks/lib/perl5/site_perl:/home/dmacks/lib64/perl5
PERL_BADLANG (unset)
SHELL=/bin/tcsh
Thread Next
-
[perl #33769] File::Temp::tempdir(CLEANUP=>1) broken when forking
by Daniel Macks