From: Jarkko Hietaniemi Date: Wed, 2 Jul 2003 20:01:06 +0000 (+0000) Subject: It would seem that in Linux 2.2 there is no way X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=80bca1b464a2919ae4e20b8134207641e7b75d04;p=p5sagit%2Fp5-mst-13.2.git It would seem that in Linux 2.2 there is no way we can do the right thing to make ps(1) see $0 our way. Also amend the $0 documentation a bit. p4raw-id: //depot/perl@19935 --- diff --git a/pod/perlvar.pod b/pod/perlvar.pod index e00ec4f..3a2ed3f 100644 --- a/pod/perlvar.pod +++ b/pod/perlvar.pod @@ -838,18 +838,22 @@ and C<$)> can be swapped only on machines supporting setregid(). =item $0 -Contains the name of the program being executed. On some (read: not -all) operating systems assigning to C<$0> modifies the argument area -that the C program sees. On some platforms you may have to use -special C options or a different C to see the changes. -Modifying the $0 is more useful as a way of indicating thecurrent -program state than it is for hiding the program you're running. -(Mnemonic: same as B and B.) +Contains the name of the program being executed. + +On some (read: not all) operating systems assigning to C<$0> modifies +the argument area that the C program sees. On some platforms you +may have to use special C options or a different C to see the +changes. Modifying the $0 is more useful as a way of indicating the +current program state than it is for hiding the program you're +running. (Mnemonic: same as B and B.) Note that there are platform specific limitations on the the maximum length of C<$0>. In the most extreme case it may be limited to the space occupied by the original C<$0>. +In some platforms there may be arbitrary amount of padding, for +example space characters, after the modified name as shown by C. + Note for BSD users: setting C<$0> does not completely remove "perl" from the ps(1) output. For example, setting C<$0> to C<"foobar"> may result in C<"perl: foobar (perl)"> (whether both the C<"perl: "> prefix @@ -858,7 +862,9 @@ and version). This is an operating system feature, Perl cannot help it. In multithreaded scripts Perl coordinates the threads so that any thread may modify its copy of the C<$0> and the change becomes visible -to ps(1) (assuming the operating system plays along). +to ps(1) (assuming the operating system plays along). Note that the +the view of C<$0> the other threads have will not change since they +have their own copies of it. =item $[ diff --git a/t/op/magic.t b/t/op/magic.t index 8f0db78..545d34b 100755 --- a/t/op/magic.t +++ b/t/op/magic.t @@ -300,7 +300,13 @@ else { }; my $ps = $mydollarzero->("x"); ok(!$ps # we allow that something goes wrong with the ps command - || $ps eq 'x' + # In Linux 2.4 we would get an exact match ($ps eq 'x') but + # in Linux 2.2 there seems to be something funny going on: + # it seems as if the original length of the argv[] would + # be stored in the proc struct and then used by ps(1), + # no matter what characters we use to pad the argv[]. + # (And if we use \0:s, they are shown as spaces.) Sigh. + || $ps =~ /^x\s*$/ # FreeBSD cannot get rid of both the leading "perl :" # and the trailing " (perl)": some FreeBSD versions # can get rid of the first one.