Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Date: Tue, 8 Feb 2005 13:46:41 -0800 From: Yitzchak Scott-Thoennes To: Reini Urban Cc: cygwin AT cygwin DOT com, libwin32 AT perl DOT org, perl5-porters AT perl DOT org Subject: [PATCH] Re: perl winpid? Message-ID: <20050208214641.GA2464@efn.org> Mail-Followup-To: Yitzchak Scott-Thoennes , Reini Urban , cygwin AT cygwin DOT com, libwin32 AT perl DOT org, perl5-porters AT perl DOT org References: <42065552 DOT 4050504 AT x-ray DOT at> <42076A6C DOT 90404 AT x-ray DOT at> <20050208063131 DOT GA3096 AT efn DOT org> <42089E17 DOT 8070000 AT familiehaase DOT de> <4208D121 DOT 3010502 AT x-ray DOT at> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4208D121.3010502@x-ray.at> User-Agent: Mutt/1.4.1i Organization: bs"d X-IsSubscribed: yes On Tue, Feb 08, 2005 at 03:48:01PM +0100, Reini Urban wrote: > Gerrit P. Haase schrieb: > >Yitzchak Scott-Thoennes wrote: > >>On Mon, Feb 07, 2005 at 02:17:32PM +0100, Reini Urban wrote: > >>>Igor Pechtchanski schrieb: > >>>>On Sun, 6 Feb 2005, Reini Urban wrote: > >>>> > >>>>>I feel quite stupid now, but found nothing simple. > >>>>>How to get the winpid from the current process in cygwin's perl? > > > >>>We will check out there where this cygwin specific functionality > >>>will go to. > >>>Win32::Process::CygwinToWin32ProcessID() is my suggestion. > > > >>I'd rather see them in the Proc:: namespace, and I think it would make > >>sense to put them in perl's cygwin.c itself, if Gerrit is willing to > >>release yet another perl-5.8.6. If this sounds OK, I'll come up with > >>a patch. > > > >I have no problem with another release. And I agree that such important > >functions should go inside perl. > > Ok. > Then we won't have to pollute the Win32::Process namespace with this > cygwin-only functionality. And we don't have to wait for the still > unmaintained libwin32 upstream. > > README.cygwin, cygwin/cygwin.c: > =item cygwin32_winpid_to_pid($pid) > > Returns the windows process ID for the given cygwin pid. cygwin-only. > > =item cygwin32_pid_to_winpid($pid) > > Returns the cygwin process ID for the given windows pid. cygwin-only. How does this look? --- README.cygwin.orig 2003-08-19 07:37:00.000000000 -0700 +++ README.cygwin 2005-02-08 11:47:03.382880000 -0800 @@ -369,6 +369,8 @@ See comment on fork in L below. +=head1 Specific features of the Cygwin port + =head2 Script Portability on Cygwin Cygwin does an outstanding job of providing UNIX-like semantics on top of @@ -470,6 +472,25 @@ =back +=head2 Prebuilt methods: + +=over 4 + +=item C + +Returns current working directory. + +=item C + +Translates a cygwin pid to the corresponding Windows pid (which may or +may not be the same). + +=item C + +Translates a Windows pid to the corresponding cygwin pid (if any). + +=back + =head1 INSTALL PERL ON CYGWIN This will install Perl, including I pages. --- perl/cygwin/cygwin.c.orig 2002-03-20 15:02:25.000000000 -0800 +++ perl/cygwin/cygwin.c 2005-02-08 12:37:48.601689600 -0800 @@ -9,6 +9,7 @@ #include #include +#include /* * pp_system() implemented via spawn() @@ -155,6 +156,39 @@ XSRETURN_UNDEF; } +static +XS(XS_Proc_Cygwin_cygwin32_pid_to_winpid) +{ + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Proc::Cygwin::cygwin32_pid_to_winpid(pid)"); + pid_t pid = (pid_t)SvIV(ST(0)); + pid_t RETVAL; + dXSTARG; + if ((RETVAL = cygwin_internal(CW_CYGWIN_PID_TO_WINPID, pid)) > 0) { + XSprePUSH; PUSHi((IV)RETVAL); + XSRETURN(1); + } + XSRETURN_UNDEF; +} + +static +XS(XS_Proc_Cygwin_cygwin32_winpid_to_pid) +{ + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Proc::Cygwin::cygwin32_winpid_to_pid(pid)"); + pid_t pid = (pid_t)SvIV(ST(0)); + pid_t RETVAL; + dXSTARG; + if ((RETVAL = cygwin32_winpid_to_pid(pid)) > 0) { + XSprePUSH; PUSHi((IV)RETVAL); + XSRETURN(1); + } + XSRETURN_UNDEF; +} + + void init_os_extras(void) { @@ -162,4 +196,8 @@ dTHX; newXS("Cwd::cwd", Cygwin_cwd, file); + newXS("Proc::Cygwin::cygwin32_winpid_to_pid", + XS_Proc_Cygwin_cygwin32_winpid_to_pid, file); + newXS("Proc::Cygwin::cygwin32_pid_to_winpid", + XS_Proc_Cygwin_cygwin32_pid_to_winpid, file); } --- perl/MANIFEST.orig 2005-02-01 04:17:14.000000000 -0800 +++ perl/MANIFEST 2005-02-08 13:35:30.299366400 -0800 @@ -2493,6 +2493,7 @@ t/lib/1_compile.t See if the various libraries and extensions compile t/lib/commonsense.t See if configuration meets basic needs t/lib/compmod.pl Helper for 1_compile.t +t/lib/cygwin.t Builtin cygwin function tests t/lib/Devel/switchd.pm Module for t/run/switchd.t t/lib/Dev/Null.pm Module for testing Test::Harness t/lib/dprof/test1_t Perl code profiler tests --- perlpatch/t/lib/cygwin.t 1970-01-01 00:00:00.000000000 +0000 +++ perl/t/lib/cygwin.t 2005-02-08 21:33:53.319916800 +0000 @@ -0,0 +1,33 @@ +#!perl + +BEGIN { + chdir 't' if -d 't'; + @INC = ('../lib'); + unless ($^O eq "cygwin") { + print "1..0 # skipped: cygwin specific test\n"; + exit 0; + } +} + +use Test::More tests => 4; + +is(Proc::Cygwin::cygwin32_winpid_to_pid( + Proc::Cygwin::cygwin32_pid_to_winpid($$)), + $$, "perl pid translates to itself"); + +my $parent = getppid; +SKIP: { + skip "test not run from cygwin process", 1 if $parent <= 1; + is(Proc::Cygwin::cygwin32_winpid_to_pid( + Proc::Cygwin::cygwin32_pid_to_winpid($parent)), + $parent, "parent pid translates to itself"); +} + +my $catpid = open my $cat, "|cat" or die "Couldn't cat: $!"; +open my $ps, "ps|" or die "Couldn't do ps: $!"; +my ($catwinpid) = map /^.\s+$catpid\s+\d+\s+\d+\s+(\d+)/, <$ps>; +close($ps); + +is(Proc::Cygwin::cygwin32_winpid_to_pid($catwinpid), $catpid, "winpid to pid"); +is(Proc::Cygwin::cygwin32_pid_to_winpid($catpid), $catwinpid, "pid to winpid"); +close($cat); > Or as seperate Proc::Cygwin package, which could be maintained at CPAN > and go to vendor_perl within gerrit's perl package? > > Proc::Cygwin::Win32ProcessID($pid) > Proc::Cygwin::CygwinProcessID($winpid) I'd rather not create a separate module for this. -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/