fix large PID overflow their column in top command

Matthew Chae Matthew.Chae at axis.com
Mon Feb 5 09:56:20 UTC 2024


Hi David,

I'm sending an improved patch based on your comments.

Not only does it not care about the PID_MAX value,
it searches all the contents to be output to recognize the required column width
and dynamically allocates the space for PID and PPID appropriately without creating a lot of empty space.

Additionally, this patch still allows user names to be displayed up to 8 characters without truncation.

Can you look through the attachment?
(0002-Allocate-PID-PPID-space-dynamically-in-top-command.patch)

BR-Matthew Chae
________________________________
From: David Laight <David.Laight at ACULAB.COM>
Sent: Thursday, November 23, 2023 6:10 PM
To: 'Denys Vlasenko' <vda.linux at googlemail.com>; Matthew Chae <Matthew.Chae at axis.com>
Cc: busybox at busybox.net <busybox at busybox.net>; Christopher Wong <Christopher.Wong at axis.com>
Subject: RE: fix large PID overflow their column in top command

...
> +       fp = xfopen_for_read("/proc/sys/kernel/pid_max");
> +       if (!fgets(pid_buf, PID_DIGITS_MAX + 1, fp)) {
> ...
> +       if (strncmp(pid_buf, "32768", 5) == 0)
> +               pid_digits_num = 5;
> +       else
> +               pid_digits_num = PID_DIGITS_MAX;
>
> The logic above is not sound. Even if sysctl kernel.pid_max
> is 32768, there can be already running processes with pids > 99999.

It's also probably wrong for pretty much all other values.

I'd just base the column width on strlen(pid_buf) with a minimum
value of 5.

It is unlikely that pid_max has been reduced - so column overflow
it that case probably doesn't really matter.

The more interesting case is really a system with a very large pid_max
that has never run many processes.
You don't really want lots of blank space.

I can't remember whether top reads everything before doing any output?
Since the output is sorted it probably almost always does.
In which case it knows the column width it will need.

I did post a patch a while back that enabled 'Irix mode'.
(100% cpu is one cpu at 100%, not all cpus at 100%)
Maybe I should dig it out again.

        David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.busybox.net/pipermail/busybox/attachments/20240205/f678d7c9/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-Allocate-PID-PPID-space-dynamically-in-top-command.patch
Type: text/x-patch
Size: 4234 bytes
Desc: 0002-Allocate-PID-PPID-space-dynamically-in-top-command.patch
URL: <http://lists.busybox.net/pipermail/busybox/attachments/20240205/f678d7c9/attachment.bin>


More information about the busybox mailing list